1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 12:41:29 +00:00

Updates TN3270.lua and scripts. It also adds an argument to disable TN3270. Closes #1455

This commit is contained in:
paulino
2019-03-21 04:07:55 +00:00
parent 2f7b505bd8
commit f9a08ccd2c
9 changed files with 113 additions and 49 deletions

View File

@@ -1,5 +1,8 @@
#Nmap Changelog ($Id$); -*-text-*- #Nmap Changelog ($Id$); -*-text-*-
o [NSE][GH#1504] Updates TN3270.lua and adds argument to disable TN3270E
[Soldier of Fortran]
o [GH#1504] RMI parser could crash when encountering invalid input o [GH#1504] RMI parser could crash when encountering invalid input
[Clément Notin] [Clément Notin]

View File

@@ -61,12 +61,13 @@ Telnet = {
EOR = "\239" EOR = "\239"
}, },
-- Thesse are the options we accept for telnet
options = { options = {
BINARY = "\000", BINARY = "\000",
EOR = "\025", EOR = "\025",
TTYPE = "\024", TTYPE = "\024",
--TN3270 = "\028", TN3270 = "\028",
TN3270 = "\040" -- Technically TN3270E TN3270E = "\040"
}, },
command = { command = {
@@ -251,6 +252,7 @@ Telnet = {
telnet_state = 0, -- same as TNS_DATA to begin with telnet_state = 0, -- same as TNS_DATA to begin with
server_options = {}, server_options = {},
client_options = {}, client_options = {},
unsupported_opts = {},
sb_options = '', sb_options = '',
connected_lu = '', connected_lu = '',
connected_dtype= '', connected_dtype= '',
@@ -452,6 +454,7 @@ Telnet = {
local TNS_DONT = 5 local TNS_DONT = 5
local TNS_SB = 6 local TNS_SB = 6
local TNS_SB_IAC = 7 local TNS_SB_IAC = 7
local supported = false
local DO_reply = self.commands.IAC .. self.commands.DO local DO_reply = self.commands.IAC .. self.commands.DO
local DONT_reply = self.commands.IAC .. self.commands.DONT local DONT_reply = self.commands.IAC .. self.commands.DONT
local WILL_reply = self.commands.IAC .. self.commands.WILL local WILL_reply = self.commands.IAC .. self.commands.WILL
@@ -488,48 +491,72 @@ Telnet = {
elseif data == self.commands.SB then self.telnet_state = TNS_SB elseif data == self.commands.SB then self.telnet_state = TNS_SB
end end
elseif self.telnet_state == TNS_WILL then elseif self.telnet_state == TNS_WILL then
-- I know if could use a for loop here with ipairs() but i find this easier to read stdnse.debug(3, "[TELNET] IAC WILL 0x%s?", stdnse.tohex(data))
if data == self.options.BINARY or data == self.options.EOR or for _,v in pairs(self.options) do -- check to see if we support this sub option (SB)
data == self.options.TTYPE or data == self.options.TN3270 then 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 if not self.server_options[data] then -- if we haven't already replied to this, let's reply
self.server_options[data] = true self.server_options[data] = true
self:send_data(DO_reply..data) self:send_data(DO_reply..data)
stdnse.debug(3, "Sent Will Reply: " .. data) stdnse.debug(3, "[TELNET] Sent Will Reply: 0x%s", stdnse.tohex(data))
self:in3270() self:in3270()
end end
else else
self:send_data(DONT_reply..data) self:send_data(DONT_reply..data)
stdnse.debug(3, "Sent Don't Reply: " .. data) stdnse.debug(3, "[TELNET] Sent Don't Reply: 0x%s", stdnse.tohex(data))
end end
self.telnet_state = TNS_DATA self.telnet_state = TNS_DATA
elseif self.telnet_state == TNS_WONT then elseif self.telnet_state == TNS_WONT then
if self.server_options[data] then if self.server_options[data] then
self.server_options[data] = false self.server_options[data] = false
self:send_data(DONT_reply..data) self:send_data(DONT_reply..data)
stdnse.debug(3, "Sent Don't Reply: " .. data) stdnse.debug(3, "[TELNET] Sent Don't Reply: 0x%s", stdnse.tohex(data))
self:in3270() self:in3270()
end end
self.telnet_state = TNS_DATA self.telnet_state = TNS_DATA
elseif self.telnet_state == TNS_DO then elseif self.telnet_state == TNS_DO then
if data == self.options.BINARY or data == self.options.EOR or stdnse.debug(3, "[TELNET] IAC DO 0x%s?", stdnse.tohex(data))
data == self.options.TTYPE or data == self.options.TN3270 then for _,v in pairs(self.options) do -- check to see if we support this sub option (SB)
-- data == self.options.STARTTLS -- ssl encryption to be added later 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 if not self.client_options[data] then
self.client_options[data] = true self.client_options[data] = true
self:send_data(WILL_reply..data) self:send_data(WILL_reply..data)
stdnse.debug(3, "Sent Do Reply: " .. data) stdnse.debug(3, "[TELNET] Sent Do Reply: 0x%s" , stdnse.tohex(data))
self:in3270() self:in3270()
end end
else else
self:send_data(WONT_reply..data) self:send_data(WONT_reply..data)
stdnse.debug(3, "Got unsupported Do. Sent Won't Reply: " .. data .. " " .. self.telnet_data) stdnse.debug(3, "[TELNET] Got unsupported Do. Sent Won't Reply: " .. data .. " " .. self.telnet_data)
end end
self.telnet_state = TNS_DATA self.telnet_state = TNS_DATA
elseif self.telnet_state == TNS_DONT then elseif self.telnet_state == TNS_DONT then
if self.client_options[data] then if self.client_options[data] then
self.client_options[data] = false self.client_options[data] = false
self:send_data(WONT_reply .. data) self:send_data(WONT_reply .. data)
stdnse.debug(3, "Sent Wont Reply: " .. data) stdnse.debug(3, "[TELNET] Sent Wont Reply: 0x%s", stdnse.tohex(data))
self:in3270() self:in3270()
end end
self.telnet_state = TNS_DATA self.telnet_state = TNS_DATA
@@ -540,7 +567,7 @@ Telnet = {
self.sb_options = self.sb_options .. data self.sb_options = self.sb_options .. data
end end
elseif self.telnet_state == TNS_SB_IAC then elseif self.telnet_state == TNS_SB_IAC then
stdnse.debug(3, "Processing SB options") 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? -- 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 if data == self.commands.SE then
self.telnet_state = TNS_DATA self.telnet_state = TNS_DATA
@@ -553,12 +580,13 @@ Telnet = {
self.device_type .. self.device_type ..
self.commands.IAC .. self.commands.IAC ..
self.commands.SE ) self.commands.SE )
elseif self.client_options[self.options.TN3270] and elseif (self.client_options[self.options.TN3270] or self.client_options[self.options.TN3270E]) and
self.sb_options:sub(1,1) == self.options.TN3270 then (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 if not self:negotiate_tn3270() then
return false return false
end end
stdnse.debug(3, "Done Negotiating Options") stdnse.debug(3, "[TELNET] Done Negotiating Options")
else else
self.telnet_state = TNS_DATA self.telnet_state = TNS_DATA
end end
@@ -587,7 +615,7 @@ Telnet = {
if self.connected_lu == '' then if self.connected_lu == '' then
self:send_data(self.commands.IAC .. self:send_data(self.commands.IAC ..
self.commands.SB .. self.commands.SB ..
self.options.TN3270 .. self.options.TN3270E ..
self.tncommands.DEVICETYPE .. self.tncommands.DEVICETYPE ..
self.tncommands.REQUEST .. self.tncommands.REQUEST ..
self.device_type .. self.device_type ..
@@ -597,7 +625,7 @@ Telnet = {
stdnse.debug(3,"[TN3270] Sending LU: %s", self.connected_lu) stdnse.debug(3,"[TN3270] Sending LU: %s", self.connected_lu)
self:send_data(self.commands.IAC .. self:send_data(self.commands.IAC ..
self.commands.SB .. self.commands.SB ..
self.options.TN3270 .. self.options.TN3270E ..
self.tncommands.DEVICETYPE .. self.tncommands.DEVICETYPE ..
self.tncommands.REQUEST .. self.tncommands.REQUEST ..
self.device_type .. self.device_type ..
@@ -631,7 +659,7 @@ Telnet = {
-- since We've connected lets send our options -- since We've connected lets send our options
self:send_data(self.commands.IAC .. self:send_data(self.commands.IAC ..
self.commands.SB .. self.commands.SB ..
self.options.TN3270 .. self.options.TN3270E ..
self.tncommands.FUNCTIONS .. self.tncommands.FUNCTIONS ..
self.tncommands.REQUEST .. self.tncommands.REQUEST ..
--self.tncommands.RESPONSES .. -- we'll only support basic 3270E mode --self.tncommands.RESPONSES .. -- we'll only support basic 3270E mode
@@ -649,7 +677,7 @@ Telnet = {
-- functions really but we'll agree to whatever they want -- functions really but we'll agree to whatever they want
self:send_data(self.commands.IAC .. self:send_data(self.commands.IAC ..
self.commands.SB .. self.commands.SB ..
self.options.TN3270 .. self.options.TN3270E ..
self.tncommands.FUNCTIONS .. self.tncommands.FUNCTIONS ..
self.tncommands.IS .. self.tncommands.IS ..
self.sb_options:sub(4,4) .. self.sb_options:sub(4,4) ..
@@ -664,29 +692,32 @@ Telnet = {
--- Check to see if we're in TN3270 --- Check to see if we're in TN3270
in3270 = function ( self ) in3270 = function ( self )
if self.client_options[self.options.TN3270] then if self.client_options[self.options.TN3270E] then
stdnse.debug(3,"[in3270] In TN3270E mode")
if self.negotiated then if self.negotiated then
stdnse.debug(3,"[in3270] TN3270E negotiated")
self.state = self.TN3270E_DATA self.state = self.TN3270E_DATA
end end
elseif self.server_options[self.options.EOR] and elseif self.client_options[self.options.EOR] and
self.server_options[self.options.BINARY] and
self.client_options[self.options.EOR] and
self.client_options[self.options.BINARY] and self.client_options[self.options.BINARY] and
self.client_options[self.options.TTYPE] then 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 self.state = self.TN3270_DATA
end end
if self.state == self.TN3270_DATA or self.state == self.TN3270E_DATA then 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 -- since we're in TN3270 mode, let's create an empty buffer
stdnse.debug(3, "Creating Empty IBM-3278-2 Buffer") stdnse.debug(3, "[in3270] Creating Empty IBM-3278-2 Buffer")
for i=0, 1920 do for i=0, 1920 do
self.buffer[i] = "\0" self.buffer[i] = "\0"
self.fa_buffer[i] = "\0" self.fa_buffer[i] = "\0"
self.overwrite_buf[i] = "\0" self.overwrite_buf[i] = "\0"
end end
stdnse.debug(3, "Empty Buffer Created. Length: " .. #self.buffer) stdnse.debug(3, "[in3270] Empty Buffer Created. Length: " .. #self.buffer)
end end
stdnse.debug(3,"Current State: "..self.word_state[self.state]) stdnse.debug(3,"[in3270] Current State: "..self.word_state[self.state])
end, end,
--- Also known as process_eor --- Also known as process_eor
@@ -1220,7 +1251,7 @@ Telnet = {
for j = i,#self.fa_buffer do for j = i,#self.fa_buffer do
-- find end of field -- find end of field
if (self.fa_buffer[j]:byte(1) & 0x20) == 0x20 then 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) 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}) table.insert(writeable_list, {i + 1, j-i-1})
break break
end end
@@ -1240,13 +1271,13 @@ Telnet = {
end end
end end
--local buff = self:get_screen() --local buff = self:get_screen()
stdnse.debug(3, "Looking for: " ..str) stdnse.debug(3, "[FIND] Looking for: %s", tostring(str))
local i, j = string.find(buff, str) local i, j = string.find(buff, str)
if i == nil then if i == nil then
stdnse.debug(3, "Couldn't find: " ..str) stdnse.debug(3, "[FIND] Couldn't find: %s", tostring(str))
return false return false
else else
stdnse.debug(3, "Found String: " ..str) stdnse.debug(3, "[FIND] Found String: %s", tostring(str))
return i , j return i , j
end end
end, end,
@@ -1262,10 +1293,10 @@ Telnet = {
end end
local i, j = string.find(buff, '%w') local i, j = string.find(buff, '%w')
if i ~= nil then if i ~= nil then
stdnse.debug(3, "Screen has text") stdnse.debug(3, "[CLEAR] Screen has text")
return false return false
else else
stdnse.debug(3, "Screen is Empty") stdnse.debug(3, "[CLEAR] Screen is Empty")
return true return true
end end
end, end,
@@ -1344,8 +1375,10 @@ Telnet = {
get_lu = function ( self ) get_lu = function ( self )
return self.connected_lu return self.connected_lu
end, end,
disable_tn3270e = function ( self )
stdnse.debug(3,"Disabling TN3270E")
table.insert(self.unsupported_opts,self.options.TN3270E)
end,
overwrite_data = function ( self ) overwrite_data = function ( self )
if not self:any_overwritten() then if not self:any_overwritten() then
return false return false

View File

@@ -57,6 +57,7 @@ found for CICS transaction IDs.
-- 2015-07-04 - v0.1 - created by Soldier of Fortran -- 2015-07-04 - v0.1 - created by Soldier of Fortran
-- 2015-11-14 - v0.2 - rewrote iterator -- 2015-11-14 - v0.2 - rewrote iterator
-- 2017-01-22 - v0.3 - added authenticated CICS ID enumeration -- 2017-01-22 - v0.3 - added authenticated CICS ID enumeration
-- 2019-02-01 - v0.4 - Removed TN3270E support (breaks location)
-- --
-- @author Philip Young -- @author Philip Young
-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html -- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
@@ -90,6 +91,7 @@ Driver = {
o.port = port o.port = port
o.options = options o.options = options
o.tn3270 = tn3270.Telnet:new() o.tn3270 = tn3270.Telnet:new()
o.tn3270:disable_tn3270e()
return o return o
end, end,
connect = function( self ) connect = function( self )
@@ -263,6 +265,7 @@ Driver = {
local function cics_test( host, port, commands, user, pass ) local function cics_test( host, port, commands, user, pass )
stdnse.debug("Checking for CICS") stdnse.debug("Checking for CICS")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
local msg = 'Unable to get to CICS' local msg = 'Unable to get to CICS'
local cics = false -- initially we're not at CICS local cics = false -- initially we're not at CICS

View File

@@ -34,6 +34,7 @@ CICS User ID brute forcing script for the CESL login screen.
-- 2016-08-29 - v0.1 - created by Soldier of Fortran -- 2016-08-29 - v0.1 - created by Soldier of Fortran
-- 2016-10-26 - v0.2 - Added RACF support -- 2016-10-26 - v0.2 - Added RACF support
-- 2017-01-23 - v0.3 - Rewrote script to use fields and skip enumeration to speed up testing -- 2017-01-23 - v0.3 - Rewrote script to use fields and skip enumeration to speed up testing
-- 2019-02-01 - v0.4 - Disabled new TN3270E support
author = "Philip Young aka Soldier of Fortran" author = "Philip Young aka Soldier of Fortran"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html" license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
@@ -60,6 +61,7 @@ Driver = {
o.port = port o.port = port
o.options = options o.options = options
o.tn3270 = tn3270.Telnet:new(brute.new_socket()) o.tn3270 = tn3270.Telnet:new(brute.new_socket())
o.tn3270:disable_tn3270e()
return o return o
end, end,
connect = function( self ) connect = function( self )
@@ -120,9 +122,10 @@ Driver = {
-- Ok we're good we're at CESL. Send the Userid and Password. -- Ok we're good we're at CESL. Send the Userid and Password.
local fields = self.tn3270:writeable() -- Get the writeable field areas local fields = self.tn3270:writeable() -- Get the writeable field areas
local user_loc = {fields[1][1],user} -- This is the 'UserID:' field local user_loc = {fields[2][1],user} -- This is the 'UserID:' field
local pass_loc = {fields[3][1],pass} -- This is the 'Password:' field ([2] is a group ID) local pass_loc = {fields[4][1],pass} -- This is the 'Password:' field ([2] is a group ID)
stdnse.verbose('Trying CICS: ' .. user ..' : ' .. pass) stdnse.verbose('[BRUTE] Trying CICS: ' .. user ..' : ' .. pass)
stdnse.debug(3,"[BRUTE] Location:" .. fields[2][1] .. " x " .. fields[4][1])
self.tn3270:send_locations({user_loc,pass_loc}) self.tn3270:send_locations({user_loc,pass_loc})
self.tn3270:get_all_data() self.tn3270:get_all_data()
stdnse.debug(2,"Screen Received for User ID: %s/%s", user, pass) stdnse.debug(2,"Screen Received for User ID: %s/%s", user, pass)
@@ -194,6 +197,7 @@ Driver = {
local function cics_test( host, port, commands ) local function cics_test( host, port, commands )
stdnse.verbose(2,"Checking for CICS Login Page") stdnse.verbose(2,"Checking for CICS Login Page")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
local cesl = false -- initially we're not at CICS local cesl = false -- initially we're not at CICS
if not status then if not status then

View File

@@ -37,6 +37,7 @@ CICS User ID enumeration script for the CESL/CESN Login screen.
-- @changelog -- @changelog
-- 2016-08-29 - v0.1 - created by Soldier of Fortran -- 2016-08-29 - v0.1 - created by Soldier of Fortran
-- 2016-12-19 - v0.2 - Added RACF support -- 2016-12-19 - v0.2 - Added RACF support
-- 2019-02-01 - v0.3 - Disabled TN3270E support
-- --
-- @author Philip Young -- @author Philip Young
-- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html -- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html
@@ -56,6 +57,7 @@ Driver = {
o.port = port o.port = port
o.options = options o.options = options
o.tn3270 = tn3270.Telnet:new() o.tn3270 = tn3270.Telnet:new()
o.tn3270:disable_tn3270e()
return o return o
end, end,
connect = function( self ) connect = function( self )
@@ -108,8 +110,8 @@ Driver = {
end end
-- At this point we MUST be at CESL/CESN to try accounts. -- At this point we MUST be at CESL/CESN to try accounts.
-- If we're not then we quit with an error -- If we're not then we quit with an error
if not (self.tn3270:find('SIGN ON TO CICS') or self.tn3270:find("Signon to CICS")) then if not (self.tn3270:find('Type your userid and password')) then
local err = brute.Error:new( "Can't get to Transaction") local err = brute.Error:new( "Can't get to Transaction CESN")
err:setRetry( true ) err:setRetry( true )
return false, err return false, err
end end
@@ -158,6 +160,7 @@ Driver = {
local function cics_test( host, port, commands, transaction ) local function cics_test( host, port, commands, transaction )
stdnse.verbose(2,"Checking for CICS Login Page") stdnse.verbose(2,"Checking for CICS Login Page")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
local cesl = false -- initially we're not at CICS local cesl = false -- initially we're not at CICS
if not status then if not status then
@@ -176,7 +179,7 @@ local function cics_test( host, port, commands, transaction )
tn:get_all_data() tn:get_all_data()
tn:get_screen_debug(2) -- for debug purposes tn:get_screen_debug(2) -- for debug purposes
-- We should now be at CICS. Check if we're already at the logon screen -- We should now be at CICS. Check if we're already at the logon screen
if tn:find('SIGN ON TO CICS') and tn:find("Signon to CICS") then if tn:find('Type your userid and password') then
stdnse.verbose(2,"At CICS Login Transaction") stdnse.verbose(2,"At CICS Login Transaction")
tn:disconnect() tn:disconnect()
return true return true

View File

@@ -44,13 +44,15 @@ Hidden fields will be listed below the screen with (row, col) coordinates.
-- --
-- @args tn3270-screen.commands a semi-colon separated list of commands you want to -- @args tn3270-screen.commands a semi-colon separated list of commands you want to
-- issue before printing the screen -- issue before printing the screen
-- tn3270-screen.lu a logical unit you with to use fails if can't connect -- tn3270-screen.lu specify a logical unit you with to use, fails if can't connect
-- tn3270-screen.disable_tn3270e disables TN3270 Enhanced mode
-- --
-- --
-- @changelog -- @changelog
-- 2015-05-30 - v0.1 - created by Soldier of Fortran -- 2015-05-30 - v0.1 - created by Soldier of Fortran
-- 2015-11-14 - v0.2 - added commands argument -- 2015-11-14 - v0.2 - added commands argument
-- 2018-09-07 - v0.3 - added support for Logical Units -- 2018-09-07 - v0.3 - added support for Logical Units
-- 2019-02-01 - v0.4 - Added ability to disable TN3270E mode
-- --
author = "Philip Young aka Soldier of Fortran" author = "Philip Young aka Soldier of Fortran"
@@ -67,12 +69,17 @@ local hidden_field_mt = {
action = function(host, port) action = function(host, port)
local commands = stdnse.get_script_args(SCRIPT_NAME .. '.commands') local commands = stdnse.get_script_args(SCRIPT_NAME .. '.commands')
local disable_tn3270e = stdnse.get_script_args(SCRIPT_NAME .. '.disable_tn3270e') or false
local lu = stdnse.get_script_args(SCRIPT_NAME .. '.lu') local lu = stdnse.get_script_args(SCRIPT_NAME .. '.lu')
local t = tn3270.Telnet:new() local t = tn3270.Telnet:new()
if lu then if lu and not disable_tn3270e then
stdnse.debug("Setting LU: %s", lu) stdnse.debug("Setting LU: %s", lu)
t:set_lu(lu) t:set_lu(lu)
end end
if disable_tn3270e then
t:disable_tn3270e()
end
local status, err = t:initiate(host,port) local status, err = t:initiate(host,port)
if not status then if not status then
stdnse.debug("Could not initiate TN3270: %s", err ) stdnse.debug("Could not initiate TN3270: %s", err )
@@ -107,7 +114,9 @@ action = function(host, port)
local out = stdnse.output_table() local out = stdnse.output_table()
out.screen = t:get_screen() out.screen = t:get_screen()
out["hidden fields"] = hidden out["hidden fields"] = hidden
out["logical unit"]= t:get_lu() if not disable_tn3270e then
out["logical unit"]= t:get_lu()
end
return out return out
end end
end end

View File

@@ -75,6 +75,7 @@ Driver = {
o.port = port o.port = port
o.options = options o.options = options
o.tn3270 = tn3270.Telnet:new(brute.new_socket()) o.tn3270 = tn3270.Telnet:new(brute.new_socket())
o.tn3270:disable_tn3270e()
return o return o
end, end,
connect = function( self ) connect = function( self )
@@ -228,6 +229,7 @@ Driver = {
local function tso_test( host, port, commands ) local function tso_test( host, port, commands )
stdnse.debug("Checking for TSO") stdnse.debug("Checking for TSO")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
local tso = false -- initially we're not at TSO logon panel local tso = false -- initially we're not at TSO logon panel
local secprod = "RACF" local secprod = "RACF"
@@ -259,7 +261,7 @@ local function tso_test( host, port, commands )
end end
tn:send_pf(3) tn:send_pf(3)
tn:disconnect() tn:disconnect()
return tso, secprod, "Could not get to TSO. Try --script-args=tso-enum.commands='logon applid(tso)'. Aborting." return tso, secprod, "Could not get to TSO. Try --script-args=tso-brute.commands='logon applid(tso)'. Aborting."
end end
--- Tests the target to see if we can speed up brute forcing --- Tests the target to see if we can speed up brute forcing
@@ -274,6 +276,7 @@ end
local function tso_skip( host, port, commands ) local function tso_skip( host, port, commands )
stdnse.debug("Checking for IKJ56700A message skip") stdnse.debug("Checking for IKJ56700A message skip")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
stdnse.debug2("Connecting TN3270 to %s:%s", host.targetname or host.ip, port.number) stdnse.debug2("Connecting TN3270 to %s:%s", host.targetname or host.ip, port.number)
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
stdnse.debug2("Displaying initial TN3270 Screen:") stdnse.debug2("Displaying initial TN3270 Screen:")

View File

@@ -57,6 +57,7 @@ TSO user IDs have the following rules:
-- 2015-10-30 - v0.2 - streamlined the code, relying on brute and unpwdb and -- 2015-10-30 - v0.2 - streamlined the code, relying on brute and unpwdb and
-- renamed to tso-enum. -- renamed to tso-enum.
-- 2017-1-13 - v0.3 - Fixed 'data' bug and added options checking to speedup -- 2017-1-13 - v0.3 - Fixed 'data' bug and added options checking to speedup
-- 2019-02-01 - v0.4 - Disabled TN3270 Enhanced support and fixed debug errors
author = "Philip Young aka Soldier of Fortran" author = "Philip Young aka Soldier of Fortran"
@@ -74,6 +75,7 @@ Driver = {
o.port = port o.port = port
o.options = options o.options = options
o.tn3270 = tn3270.Telnet:new() o.tn3270 = tn3270.Telnet:new()
o.tn3270:disable_tn3270e()
return o return o
end, end,
connect = function( self ) connect = function( self )
@@ -165,6 +167,7 @@ Driver = {
local function tso_test( host, port, commands ) local function tso_test( host, port, commands )
stdnse.debug("Checking for TSO") stdnse.debug("Checking for TSO")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
local tso = false -- initially we're not at TSO logon panel local tso = false -- initially we're not at TSO logon panel
local secprod = "RACF" local secprod = "RACF"
@@ -211,6 +214,7 @@ end
local function tso_skip( host, port, commands ) local function tso_skip( host, port, commands )
stdnse.debug("Checking for IKJ56700A message skip") stdnse.debug("Checking for IKJ56700A message skip")
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
stdnse.debug2("Connecting TN3270 to %s:%s", host.targetname or host.ip, port.number) stdnse.debug2("Connecting TN3270 to %s:%s", host.targetname or host.ip, port.number)
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
stdnse.debug2("Displaying initial TN3270 Screen:") stdnse.debug2("Displaying initial TN3270 Screen:")

View File

@@ -57,7 +57,7 @@ found for application IDs.
-- 2015-11-14 - v0.3 - rewrote iterator -- 2015-11-14 - v0.3 - rewrote iterator
-- 2017-01-13 - v0.4 - Fixed 'macros' bug with default vtam screen and test -- 2017-01-13 - v0.4 - Fixed 'macros' bug with default vtam screen and test
-- and added threshold for macros screen checking -- and added threshold for macros screen checking
-- -- 2019-02-01 - v0.5 - Disabling Enhanced mode
author = "Philip Young aka Soldier of Fortran" author = "Philip Young aka Soldier of Fortran"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html" license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
@@ -104,6 +104,7 @@ Driver = {
o.port = port o.port = port
o.options = options o.options = options
o.tn3270 = tn3270.Telnet:new() o.tn3270 = tn3270.Telnet:new()
o.tn3270:disable_tn3270e()
return o return o
end, end,
connect = function( self ) connect = function( self )
@@ -181,6 +182,7 @@ Driver = {
-- @return status true on success, false on failure -- @return status true on success, false on failure
local function vtam_test( host, port, commands, macros) local function vtam_test( host, port, commands, macros)
local tn = tn3270.Telnet:new() local tn = tn3270.Telnet:new()
tn:disable_tn3270e()
local status, err = tn:initiate(host,port) local status, err = tn:initiate(host,port)
stdnse.debug1("Testing if VTAM and 'logon applid' command supported") stdnse.debug1("Testing if VTAM and 'logon applid' command supported")
stdnse.debug2("Connecting TN3270 to %s:%s", host.targetname or host.ip, port.number) stdnse.debug2("Connecting TN3270 to %s:%s", host.targetname or host.ip, port.number)