wibrfake-brk 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +48 -0
  3. data/.gitattributes +19 -0
  4. data/.github/dependabot.yml +12 -0
  5. data/.github/workflows/ci.yml +90 -0
  6. data/.rubocop.yml +8 -0
  7. data/.ruby-version +1 -0
  8. data/Dockerfile +69 -0
  9. data/Gemfile +68 -0
  10. data/README.md +188 -0
  11. data/Rakefile +6 -0
  12. data/app/assets/config/manifest.js +5 -0
  13. data/app/assets/images/.keep +0 -0
  14. data/app/assets/images/2024-12-30-07:58:34-screenshot.png +0 -0
  15. data/app/assets/images/facebook/facebook-logo.svg +3 -0
  16. data/app/assets/images/google/googlelogo_color_272x92dp.png +0 -0
  17. data/app/assets/images/instagram/app-store.png +0 -0
  18. data/app/assets/images/instagram/google-play.png +0 -0
  19. data/app/assets/images/instagram/instagram-logo.png +0 -0
  20. data/app/assets/images/instagram/screenshot1.png +0 -0
  21. data/app/assets/images/instagram/screenshot2.png +0 -0
  22. data/app/assets/images/instagram/screenshot3.png +0 -0
  23. data/app/assets/images/instagram/screenshot4.png +0 -0
  24. data/app/assets/images/nauta_etecsa/CUBADEBATE.jpg +0 -0
  25. data/app/assets/images/nauta_etecsa/CUBAEDUCA.jpg +0 -0
  26. data/app/assets/images/nauta_etecsa/CUBARTE.jpg +0 -0
  27. data/app/assets/images/nauta_etecsa/CUBASI.jpg +0 -0
  28. data/app/assets/images/nauta_etecsa/ECURED.jpg +0 -0
  29. data/app/assets/images/nauta_etecsa/OFERTAS.jpg +0 -0
  30. data/app/assets/images/nauta_etecsa/PAPELETA.jpg +0 -0
  31. data/app/assets/images/nauta_etecsa/contenedor_bg.jpg +0 -0
  32. data/app/assets/images/nauta_etecsa/etecsa.jpg +0 -0
  33. data/app/assets/images/nauta_etecsa/nauta_wifi.jpg +0 -0
  34. data/app/assets/images/nauta_hogar/CUBADEBATE.jpg +0 -0
  35. data/app/assets/images/nauta_hogar/CUBAEDUCA.jpg +0 -0
  36. data/app/assets/images/nauta_hogar/CUBARTE.jpg +0 -0
  37. data/app/assets/images/nauta_hogar/CUBASI.jpg +0 -0
  38. data/app/assets/images/nauta_hogar/ECURED.jpg +0 -0
  39. data/app/assets/images/nauta_hogar/OFERTAS.jpg +0 -0
  40. data/app/assets/images/nauta_hogar/PAPELETA.jpg +0 -0
  41. data/app/assets/images/nauta_hogar/banner_hogar.png +0 -0
  42. data/app/assets/images/wibrfake/Breaker-Wallpaper1.jpg +0 -0
  43. data/app/assets/images/wibrfake/mac-list-parameter.png +0 -0
  44. data/app/assets/images/wibrfake/wibrfake-100x100.png +0 -0
  45. data/app/assets/images/wibrfake/wibrfake-32x32.png +0 -0
  46. data/app/assets/images/wibrfake/wibrfake-48x48.png +0 -0
  47. data/app/assets/images/wibrfake/wibrfake-apfake-on.png +0 -0
  48. data/app/assets/images/wibrfake/wibrfake-apfake-set-basic.png +0 -0
  49. data/app/assets/images/wibrfake/wibrfake-apfake-show.png +0 -0
  50. data/app/assets/images/wibrfake/wibrfake-help.png +0 -0
  51. data/app/assets/images/wibrfake/wibrfake-hostpot.png +0 -0
  52. data/app/assets/images/wibrfake/wibrfake-init.png +0 -0
  53. data/app/assets/images/wibrfake/wibrfake-init2.png +0 -0
  54. data/app/assets/images/wibrfake/wibrfake-login-basic.jpg +0 -0
  55. data/app/assets/images/wibrfake/wibrfake-mac-list.png +0 -0
  56. data/app/assets/images/wibrfake/wibrfake-mac-ramset-oui.png +0 -0
  57. data/app/assets/images/wibrfake/wibrfake-mac-ramset.png +0 -0
  58. data/app/assets/images/wibrfake/wibrfake-mac-set.png +0 -0
  59. data/app/assets/images/wibrfake/wibrfake-mac-show.png +0 -0
  60. data/app/assets/images/wibrfake/wibrfake-need-signin.jpg +0 -0
  61. data/app/assets/images/wibrfake/wibrfake-session-active.png +0 -0
  62. data/app/assets/images/wibrfake/wibrfake-session-init.png +0 -0
  63. data/app/assets/images/wibrfake/wibrfake-session-list.png +0 -0
  64. data/app/assets/images/wibrfake/wibrfake-session-new.png +0 -0
  65. data/app/assets/images/wibrfake/wibrfake-session-rename.png +0 -0
  66. data/app/assets/images/wibrfake/wibrfake-session-save.png +0 -0
  67. data/app/assets/images/wibrfake/wibrfake-web-server-apfake.png +0 -0
  68. data/app/assets/images/wibrfake/wibrfake-web-server-on.png +0 -0
  69. data/app/assets/images/wibrfake/wibrfake-web-server-show.png +0 -0
  70. data/app/assets/images/wibrfake/wibrfake-wkdump-loaded.png +0 -0
  71. data/app/assets/images/wibrfake/wibrfake-wkdump.png +0 -0
  72. data/app/assets/images/wibrfake/wibrfake.png +0 -0
  73. data/app/assets/stylesheets/application.css +15 -0
  74. data/app/assets/stylesheets/basic/page_basic.css +0 -0
  75. data/app/assets/stylesheets/facebook/page_facebook.css +93 -0
  76. data/app/assets/stylesheets/google/page_google.css +137 -0
  77. data/app/assets/stylesheets/instagram/page_instagram.css +94 -0
  78. data/app/assets/stylesheets/nauta_etecsa/page_nauta.css +325 -0
  79. data/app/assets/stylesheets/nauta_hogar/page_nauta.css +469 -0
  80. data/app/assets/stylesheets/wibrfake/page_wibrfake.css +1181 -0
  81. data/app/assets/stylesheets/wibrfake/page_wibrfake_about.css +486 -0
  82. data/app/channels/application_cable/channel.rb +4 -0
  83. data/app/channels/application_cable/connection.rb +4 -0
  84. data/app/controllers/application_controller.rb +15 -0
  85. data/app/controllers/concerns/.keep +0 -0
  86. data/app/controllers/sessions_controller.rb +111 -0
  87. data/app/helpers/application_helper.rb +2 -0
  88. data/app/helpers/sessions_helper.rb +2 -0
  89. data/app/javascript/application.js +3 -0
  90. data/app/javascript/bootstrap.bundle.min.js +7 -0
  91. data/app/javascript/controllers/application.js +9 -0
  92. data/app/javascript/controllers/hello_controller.js +7 -0
  93. data/app/javascript/controllers/index.js +4 -0
  94. data/app/javascript/google/page_google.js +50 -0
  95. data/app/javascript/incorrect3.js +29 -0
  96. data/app/javascript/page_wibrfake.js +50 -0
  97. data/app/javascript/page_wibrfake_about.js +147 -0
  98. data/app/jobs/application_job.rb +7 -0
  99. data/app/mailers/application_mailer.rb +4 -0
  100. data/app/models/application_record.rb +3 -0
  101. data/app/models/concerns/.keep +0 -0
  102. data/app/models/user.rb +6 -0
  103. data/app/views/layouts/application.html.erb +33 -0
  104. data/app/views/layouts/mailer.html.erb +13 -0
  105. data/app/views/layouts/mailer.text.erb +1 -0
  106. data/app/views/pwa/manifest.json.erb +22 -0
  107. data/app/views/pwa/service-worker.js +26 -0
  108. data/app/views/sessions/basic/basic.html.erb +21 -0
  109. data/app/views/sessions/facebook/facebook.html.erb +132 -0
  110. data/app/views/sessions/google/google.html.erb +72 -0
  111. data/app/views/sessions/index.html.erb +11 -0
  112. data/app/views/sessions/instagram/instagram.html.erb +69 -0
  113. data/app/views/sessions/nauta_etecsa/nauta_etecsa.html.erb +97 -0
  114. data/app/views/sessions/nauta_hogar/nauta_hogar.html.erb +135 -0
  115. data/app/views/sessions/wibrfake/about/about.html.erb +164 -0
  116. data/app/views/sessions/wibrfake/wibrfake.html.erb +417 -0
  117. data/bin/.names.rb.swp +0 -0
  118. data/bin/brakeman +7 -0
  119. data/bin/bundle +114 -0
  120. data/bin/docker-entrypoint +13 -0
  121. data/bin/google.wkdump +3 -0
  122. data/bin/importmap +4 -0
  123. data/bin/rails +4 -0
  124. data/bin/rake +4 -0
  125. data/bin/rubocop +8 -0
  126. data/bin/setup +37 -0
  127. data/bin/wibrfake +20 -0
  128. data/config/application.rb +26 -0
  129. data/config/boot.rb +4 -0
  130. data/config/cable.yml +10 -0
  131. data/config/credentials.yml.enc +1 -0
  132. data/config/database.yml +16 -0
  133. data/config/environment.rb +5 -0
  134. data/config/environments/development.rb +85 -0
  135. data/config/environments/production.rb +105 -0
  136. data/config/environments/test.rb +67 -0
  137. data/config/icons/application-x-wkdump.xml +13 -0
  138. data/config/icons/hicolor/16x16/mimetypes/application-x-wkdump.png +0 -0
  139. data/config/icons/hicolor/32x32/mimetypes/application-x-wkdump.png +0 -0
  140. data/config/icons/hicolor/48x48/mimetypes/application-x-wkdump.png +0 -0
  141. data/config/icons/hicolor/icon-theme.cache +0 -0
  142. data/config/icons/hicolor/index.theme +20 -0
  143. data/config/icons/wkdump.desktop +5 -0
  144. data/config/importmap.rb +7 -0
  145. data/config/initializers/assets.rb +12 -0
  146. data/config/initializers/content_security_policy.rb +25 -0
  147. data/config/initializers/devise.rb +313 -0
  148. data/config/initializers/filter_parameter_logging.rb +8 -0
  149. data/config/initializers/inflections.rb +16 -0
  150. data/config/initializers/permissions_policy.rb +13 -0
  151. data/config/locales/devise.en.yml +65 -0
  152. data/config/locales/en.yml +31 -0
  153. data/config/puma.rb +35 -0
  154. data/config/routes.rb +12 -0
  155. data/config/storage.yml +34 -0
  156. data/config.ru +6 -0
  157. data/db/development.sqlite3 +0 -0
  158. data/db/schema.rb +14 -0
  159. data/ext/wibrfake/extconf.rb +3 -0
  160. data/ext/wibrfake/wibrfake.h +0 -0
  161. data/images/ouilist.png +0 -0
  162. data/images/wibrfakehelp.png +0 -0
  163. data/images/wibrfakeinit.png +0 -0
  164. data/lib/assets/.keep +0 -0
  165. data/lib/tasks/.keep +0 -0
  166. data/lib/wibrfake/Config/ipaddr.rb +71 -0
  167. data/lib/wibrfake/Config/options.rb +98 -0
  168. data/lib/wibrfake/Config/security_wpa.rb +43 -0
  169. data/lib/wibrfake/DataBase/howuis.db +0 -0
  170. data/lib/wibrfake/DataBase/ouis.db +0 -0
  171. data/lib/wibrfake/DataBase/ouis.rb +24 -0
  172. data/lib/wibrfake/DataBase/rename.rb +15 -0
  173. data/lib/wibrfake/DataBase/show.rb +18 -0
  174. data/lib/wibrfake/Dnsmasq/dhcp.rb +149 -0
  175. data/lib/wibrfake/Dnsmasq/dhcp_prueba.rb +135 -0
  176. data/lib/wibrfake/Dnsmasq/dns.rb +34 -0
  177. data/lib/wibrfake/Dnsmasq/dns_prueba.rb +36 -0
  178. data/lib/wibrfake/Dnsmasq/dnsmasq.rb +33 -0
  179. data/lib/wibrfake/Listing/apfake.rb +28 -0
  180. data/lib/wibrfake/Listing/clients.rb +76 -0
  181. data/lib/wibrfake/Listing/ouis.rb +53 -0
  182. data/lib/wibrfake/Listing/process.rb +14 -0
  183. data/lib/wibrfake/Listing/sessions.rb +47 -0
  184. data/lib/wibrfake/Listing/web_server.rb +17 -0
  185. data/lib/wibrfake/Listing/wireless.rb +30 -0
  186. data/lib/wibrfake/Logs/credentials.log +59 -0
  187. data/lib/wibrfake/NetworkInterface/ip-routing.rb +99 -0
  188. data/lib/wibrfake/NetworkInterface/mac.rb +114 -0
  189. data/lib/wibrfake/NetworkInterface/monitor.rb +44 -0
  190. data/lib/wibrfake/NetworkInterface/ouis.db +0 -0
  191. data/lib/wibrfake/Process/id.rb +11 -0
  192. data/lib/wibrfake/Process/pids.log +5 -0
  193. data/lib/wibrfake/Process/pkill.rb +124 -0
  194. data/lib/wibrfake/Process/processes.rb +76 -0
  195. data/lib/wibrfake/Rails/login.rb +20 -0
  196. data/lib/wibrfake/Rails/routes.rb +76 -0
  197. data/lib/wibrfake/Rails/service.rb +58 -0
  198. data/lib/wibrfake/Rails/service_usage.rb +46 -0
  199. data/lib/wibrfake/Sessions/session.rb +188 -0
  200. data/lib/wibrfake/String/string.rb +109 -0
  201. data/lib/wibrfake/Tmp/config.yml +1 -0
  202. data/lib/wibrfake/config.rb +24 -0
  203. data/lib/wibrfake/help.rb +107 -0
  204. data/lib/wibrfake/optionpr.rb +68 -0
  205. data/lib/wibrfake/run.rb +9 -0
  206. data/lib/wibrfake/ty/apld.rb +110 -0
  207. data/lib/wibrfake/ty/prompt/answers_collector.rb +78 -0
  208. data/lib/wibrfake/ty/prompt/block_paginator.rb +59 -0
  209. data/lib/wibrfake/ty/prompt/choice.rb +147 -0
  210. data/lib/wibrfake/ty/prompt/choices.rb +129 -0
  211. data/lib/wibrfake/ty/prompt/confirm_question.rb +158 -0
  212. data/lib/wibrfake/ty/prompt/const.rb +17 -0
  213. data/lib/wibrfake/ty/prompt/converter_dsl.rb +21 -0
  214. data/lib/wibrfake/ty/prompt/converter_registry.rb +69 -0
  215. data/lib/wibrfake/ty/prompt/converters.rb +182 -0
  216. data/lib/wibrfake/ty/prompt/distance.rb +49 -0
  217. data/lib/wibrfake/ty/prompt/enum_list.rb +433 -0
  218. data/lib/wibrfake/ty/prompt/errors.rb +31 -0
  219. data/lib/wibrfake/ty/prompt/evaluator.rb +29 -0
  220. data/lib/wibrfake/ty/prompt/expander.rb +321 -0
  221. data/lib/wibrfake/ty/prompt/keypress.rb +98 -0
  222. data/lib/wibrfake/ty/prompt/list.rb +589 -0
  223. data/lib/wibrfake/ty/prompt/mask_question.rb +96 -0
  224. data/lib/wibrfake/ty/prompt/multi_list.rb +224 -0
  225. data/lib/wibrfake/ty/prompt/multiline.rb +72 -0
  226. data/lib/wibrfake/ty/prompt/paginator.rb +111 -0
  227. data/lib/wibrfake/ty/prompt/question/checks.rb +105 -0
  228. data/lib/wibrfake/ty/prompt/question/modifier.rb +96 -0
  229. data/lib/wibrfake/ty/prompt/question/validation.rb +72 -0
  230. data/lib/wibrfake/ty/prompt/question.rb +391 -0
  231. data/lib/wibrfake/ty/prompt/result.rb +42 -0
  232. data/lib/wibrfake/ty/prompt/selected_choices.rb +77 -0
  233. data/lib/wibrfake/ty/prompt/slider.rb +286 -0
  234. data/lib/wibrfake/ty/prompt/statement.rb +55 -0
  235. data/lib/wibrfake/ty/prompt/suggestion.rb +113 -0
  236. data/lib/wibrfake/ty/prompt/symbols.rb +89 -0
  237. data/lib/wibrfake/ty/prompt/test.rb +36 -0
  238. data/lib/wibrfake/ty/prompt/timer.rb +75 -0
  239. data/lib/wibrfake/ty/prompt/utils.rb +42 -0
  240. data/lib/wibrfake/ty/prompt/version.rb +7 -0
  241. data/lib/wibrfake/ty/prompt.rb +589 -0
  242. data/lib/wibrfake/version.rb +5 -0
  243. data/lib/wibrfake/wibrfake_cli.rb +683 -0
  244. data/log/.keep +0 -0
  245. data/pruebas/daemon1.pid +1 -0
  246. data/pruebas/daemon2.pid +1 -0
  247. data/pruebas/daemons.rb +44 -0
  248. data/public/404.html +67 -0
  249. data/public/406-unsupported-browser.html +66 -0
  250. data/public/422.html +67 -0
  251. data/public/500.html +66 -0
  252. data/public/icon.png +0 -0
  253. data/public/icon.svg +3 -0
  254. data/public/robots.txt +1 -0
  255. data/storage/.keep +0 -0
  256. data/test/application_system_test_case.rb +5 -0
  257. data/test/channels/application_cable/connection_test.rb +13 -0
  258. data/test/controllers/.keep +0 -0
  259. data/test/controllers/sessions_controller_test.rb +7 -0
  260. data/test/fixtures/files/.keep +0 -0
  261. data/test/fixtures/users.yml +11 -0
  262. data/test/helpers/.keep +0 -0
  263. data/test/integration/.keep +0 -0
  264. data/test/mailers/.keep +0 -0
  265. data/test/models/.keep +0 -0
  266. data/test/models/user_test.rb +7 -0
  267. data/test/system/.keep +0 -0
  268. data/test/test_helper.rb +15 -0
  269. data/tmp/.keep +0 -0
  270. data/tmp/pids/.keep +0 -0
  271. data/tmp/storage/.keep +0 -0
  272. data/vendor/.keep +0 -0
  273. data/vendor/javascript/.keep +0 -0
  274. data/wibrfake.gemspec +49 -0
  275. metadata +743 -0
@@ -0,0 +1,98 @@
1
+ require_relative 'ipaddr'
2
+ require_relative 'security_wpa'
3
+ module WibrFake
4
+ class Config < SecurityWPA
5
+ def initialize(configAP, iface, id)
6
+ #if(configAP.macaddr_acl=="yes")
7
+ # configAP.macaddr_acl = 0
8
+ #else
9
+ # configAP.macaddr_acl = 1
10
+ #end
11
+ tmp_id = File.join(File.dirname(__FILE__), '..', 'Tmp', id)
12
+ unless(Dir.exist?(File.join(tmp_id, 'hostapd')))
13
+ Dir.mkdir(File.join(tmp_id, 'hostapd'))
14
+ end
15
+ unless(Dir.exist?(File.join(tmp_id, 'wkdump')))
16
+ Dir.mkdir(File.join(tmp_id, 'wkdump'))
17
+ end
18
+ unless(Dir.exist?(File.join(tmp_id, 'credentials')))
19
+ Dir.mkdir(File.join(tmp_id, 'credentials'))
20
+ end
21
+ File.open(File.join(tmp_id, 'hostapd', 'hostapd.conf'), 'w'){|file|
22
+ file.puts "interface=#{iface}"
23
+ file.puts "driver=#{configAP.driver}"
24
+ file.puts "ssid=#{configAP.ssid}"
25
+ file.puts configAP.ignore_ssid=="enable"? "ignore_broadcast_ssid=0" : "ignore_broadcast_ssid=1"
26
+ file.puts "hw_mode=#{configAP.hw_mode}"
27
+ file.puts "channel=#{configAP.channel}"
28
+ #file.puts configAP.macaddr_acl=="enable"? "macaddr_acl=1":"macaddr_acl=0"
29
+ unless(configAP.wpa.nil?)
30
+ file.puts configAP.wpa=="wpa2"? "wpa=2": configAP.wpa=="wpa"? "wpa=1":"wpa=0"
31
+ file.puts configAP.wpa=="wpa2"? "wpa_passphrase=#{configAP.password}": configAP.wpa=="wpa"? "wpa_passphrase=#{configAP.password}":"wep_key0=#{configAP.password}\nwep_default_key=0"
32
+ file.puts "wpa_key_mgmt=#{configAP.wpa_key_mgmt}" if(configAP.wpa=="wpa2")
33
+ file.puts "wpa_pairwise=#{configAP.wpa_pairwise}" if(configAP.wpa=="wpa2")
34
+ file.puts "wpa_group_rekey=#{configAP.wpa_rekey}" if(!configAP.wpa_rekey.nil?)
35
+ else
36
+ file.puts "wpa=0"
37
+ end
38
+ file.puts configAP.wpa=="wep"? "auth_algs=2":"auth_algs=1"
39
+ file.puts configAP.wmm=="enable"? "wmm_enabled=1":"wmm_enabled=0"
40
+ }
41
+
42
+ File.open(File.join(tmp_id, 'wkdump', "#{id}.wkdump"), 'w'){|file|
43
+ file.puts "set iface #{iface}"
44
+ file.puts "set driver #{configAP.driver}"
45
+ file.puts "set ssid #{configAP.ssid}"
46
+ file.puts configAP.ignore_ssid=="enable"? "set ignore_ssid enable" : "set ignore_ssid disable"
47
+ file.puts "set hw_mode #{configAP.hw_mode}"
48
+ file.puts "set channel #{configAP.channel}"
49
+ #file.puts configAP.macaddr_acl=="enable"? "set macaddr_acl enable" : "set macaddr_acl disable"
50
+ unless(configAP.wpa.nil?)
51
+ file.puts configAP.wpa=="wpa2"? "set wp wpa2": configAP.wpa=="wpa"? "set wp wpa" : "set wp wep"
52
+ file.puts "set password #{configAP.password}"
53
+ file.puts "set key_mgmt #{configAP.wpa_key_mgmt}" if(configAP.wpa=="wpa2")
54
+ file.puts "set pairwise #{configAP.wpa_pairwise}" if(configAP.wpa=="wpa2")
55
+ file.puts "set rekey #{configAP.wpa_rekey}" if(!configAP.wpa_rekey.nil?)
56
+ else
57
+ file.puts "set wp nil"
58
+ end
59
+ file.puts configAP.wmm=="enable"? "set wmm enable" : "set wmm disable"
60
+ file.puts "set login #{configAP.login}"
61
+ file.puts "set route #{configAP.login_route}"
62
+ file.puts "set port #{configAP.port}"
63
+ }
64
+ end
65
+
66
+ def self.apfake(configAP)
67
+ begin
68
+ configAP.ipaddr = WibrFake::IPAddr.new("172.168.1.1", "255.255.255.0")
69
+ rescue => e
70
+ puts e.message
71
+ exit(1)
72
+ end
73
+ configAP.ssid = "WibrFake Hacking"
74
+ configAP.password = nil
75
+ configAP.login = "basic"
76
+ configAP.login_route = "login/"
77
+ configAP.driver = "nl80211"
78
+ configAP.channel = 6
79
+ configAP.port = 80
80
+ configAP.hw_mode = "g"
81
+ configAP.wpa = nil
82
+ configAP.wpa_pairwise = "CCMP"
83
+ configAP.wpa_key_mgmt = "WPA-PSK"
84
+ configAP.wpa_rekey = nil
85
+ configAP.ieee80211n = 1
86
+ configAP.wmm = "enable"
87
+ configAP.ignore_ssid = "enable"
88
+ configAP.macaddr_acl = "disable"
89
+ configAP.loopback = "127.0.0.1"
90
+ configAP.host_server = "0.0.0.0"
91
+ configAP.file_wkdump = nil
92
+ configAP.path_credential = nil
93
+ configAP.session_remove = true
94
+ configAP.session_modified = true
95
+ return configAP
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,43 @@
1
+ module WibrFake
2
+ class SecurityWPA
3
+ def self.scan_mgmt(wpa, mgmt)
4
+ #config wpa security
5
+ wpa1_key_mgmt = %w[WPA-PSK WPA-EAP WPA-PSK-SHA1 KEY_MGMT_802_1X]
6
+ wpa2_key_mgmt = wpa1_key_mgmt + %w[WPA-PSK-SHA256 WPA-EAP-SHA256 WPA-EAP-GCT WPA-EAP-FAST WPA-EAP-TTLS WPA-EAP-PEAP WPA-EAP-PSK]
7
+ wpa3_key_mgmt = %w[SAE]
8
+ if(wpa=="wpa")
9
+ unless(wpa1_key_mgmt.include?(mgmt))
10
+ puts "Clave #{mgmt} no es valido para #{wpa}"
11
+ return 1
12
+ end
13
+ elsif(wpa=="wpa2")
14
+ unless(wpa2_key_mgmt.include?(mgmt))
15
+ puts "Clave #{mgmt} no es valido para #{wpa}"
16
+ return 1
17
+ end
18
+ elsif(wpa=="wpa3")
19
+ unless(wpa3_key_mgmt.include?(mgmt))
20
+ puts "Clave #{mgmt} no es valido para #{wpa}"
21
+ return 1
22
+ end
23
+ end
24
+ return 0
25
+ end
26
+ def self.scan_pairwise(wpa, pairwise)
27
+ wpa12_pairwise = %w[TKIP CCMP]
28
+ wpa3_pairwise = %w[GCMP]
29
+ if(wpa=="wpa") or (wpa=="wpa2")
30
+ unless(wpa12_pairwise.include?(pairwise))
31
+ puts "Cifrado #{pairwise} no es compatible o no existe para #{wpa}"
32
+ return 1
33
+ end
34
+ elsif(wpa=="wpa3")
35
+ unless(wpa3_pairwise.include?(pairwise))
36
+ puts "Cifrado #{pairwise} no es compatible o no existe para #{wpa}"
37
+ return 1
38
+ end
39
+ end
40
+ return 0
41
+ end
42
+ end
43
+ end
File without changes
Binary file
@@ -0,0 +1,24 @@
1
+ require 'sqlite3'
2
+
3
+ howui = Array.new
4
+ name = Array.new
5
+ db = SQLite3::Database.new "ouis.db"
6
+
7
+ # Crear la tabla howuis_mac si no existe
8
+ db.execute <<-SQL
9
+ CREATE TABLE IF NOT EXISTS howuis_mac (
10
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
11
+ howui TEXT,
12
+ name TEXT
13
+ );
14
+ SQL
15
+
16
+ # Insertar los datos en la tabla
17
+ howui.each_with_index do |h, index|
18
+ db.execute("INSERT INTO howuis_mac (howui, name) VALUES (?, ?)", [h, name[index]])
19
+ end
20
+
21
+ # Cerrar la base de datos
22
+ db.close
23
+
24
+ puts "Datos insertados correctamente en la base de datos."
@@ -0,0 +1,15 @@
1
+ require 'sqlite3'
2
+
3
+ # Abrir la base de datos existente
4
+ db = SQLite3::Database.new "howuis.db" # Asegúrate de que este sea el nombre correcto de tu base de datos
5
+
6
+ # Renombrar la tabla de howuis_mac a ouis_mac
7
+ db.execute("ALTER TABLE howuis_mac RENAME TO ouis_mac;")
8
+
9
+ # Renombrar la columna de howui a oui
10
+ db.execute("ALTER TABLE ouis_mac RENAME COLUMN howui TO oui;")
11
+
12
+ # Cerrar la base de datos
13
+ db.close
14
+
15
+ puts "Tabla y columna renombradas correctamente."
@@ -0,0 +1,18 @@
1
+ require 'sqlite3'
2
+
3
+ db = SQLite3::Database.new "ouis.db"
4
+
5
+ rows = db.execute("SELECT id, name FROM ouis_mac WHERE oui = ?", "f2:1a:af")
6
+ a = ''
7
+ puts "ID\tOUIS\t\tNAME"
8
+ puts "-" * 30
9
+ rows.each do |row|
10
+ if row.empty?
11
+ puts "No se encontro el oui"
12
+ else
13
+ puts "Index: #{row[0]}"
14
+ puts "Name: #{row[1]}"
15
+ end
16
+ end
17
+ db.close
18
+ puts a
@@ -0,0 +1,149 @@
1
+ module DHCP
2
+ def dhcp
3
+ socket = UDPSocket.new
4
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
5
+ socket.bind('0.0.0.0', 67)
6
+ leases = {}
7
+ begin
8
+ loop do
9
+ data, client = socket.recvfrom(1024)
10
+ next unless data[0].ord == 1
11
+
12
+ mac = data[28..33].unpack('H2H2H2H2H2H2').join(':')
13
+ xid = data[4..7].b
14
+
15
+ # Parsear opciones DHCP
16
+ options = data[240..-1].b
17
+ msg_type = nil
18
+ hostname = 'Desconocido'
19
+ index = 0
20
+
21
+ while index < options.size
22
+ tag = options[index].ord
23
+ break if tag == 255
24
+
25
+ if tag == 53
26
+ len = options[index + 1].ord
27
+ msg_type = options[index + 2].ord
28
+ elsif tag == 12 # Opción de Hostname
29
+ len = options[index + 1].ord
30
+ hostname = options[index + 2, len].to_s.force_encoding('UTF-8').scrub
31
+ hostname = 'Sin nombre' if hostname.empty?
32
+ end
33
+
34
+ len = options[index + 1].ord rescue 0
35
+ index += 2 + len
36
+ end
37
+
38
+ if msg_type == 1 # DHCP Discover
39
+ offered_ip = "#{@ip_vac}#{rand(2..254).to_s}"
40
+ leases[mac] = {
41
+ ip: offered_ip,
42
+ hostname: hostname
43
+ }
44
+
45
+ # Construir DHCP Offer
46
+ dhcp_options = [
47
+ 53, 1, 2, # DHCP Offer
48
+ 54, 4, *IPAddr.new(@ip).hton.unpack('C4'),
49
+ 51, 4, *[@lease_time].pack('N').unpack('C4'),
50
+ 1, 4, *IPAddr.new(@subnet_mask).hton.unpack('C4'),
51
+ 3, 4, *IPAddr.new(@ip).hton.unpack('C4'),
52
+ 6, 4, *@dns_servers,
53
+ 15, @domain_name.bytes.size, *@domain_name.bytes,
54
+ 28, 4, *IPAddr.new(@broadcast_addr).hton.unpack('C4'),
55
+ 255
56
+ ].flatten.pack('C*').b
57
+
58
+ response = [
59
+ 0x02.chr.force_encoding('BINARY'),
60
+ 0x01.chr.force_encoding('BINARY'),
61
+ 0x06.chr.force_encoding('BINARY'),
62
+ 0x00.chr.force_encoding('BINARY'),
63
+ xid,
64
+ [0].pack('n').b,
65
+ [0x8000].pack('n').b,
66
+ "\x00\x00\x00\x00".b,
67
+ IPAddr.new(offered_ip).hton.b,
68
+ IPAddr.new(@ip).hton.b,
69
+ "\x00\x00\x00\x00".b,
70
+ data[28..43].b,
71
+ ("\x00" * 64).b,
72
+ ("\x00" * 128).b,
73
+ "\x63\x82\x53\x63".b,
74
+ dhcp_options
75
+ ].join
76
+
77
+ socket.send(response, 0, @broadcast_addr, 68)
78
+
79
+ elsif msg_type == 3 # DHCP Request
80
+ lease = leases[mac]
81
+ if lease
82
+ # Actualizar hostname si viene en el Request
83
+ lease[:hostname] = hostname unless hostname == 'unknow'
84
+
85
+ # Construir DHCP Ack
86
+ dhcp_options = [
87
+ 53, 1, 5,
88
+ 54, 4, *IPAddr.new(@ip).hton.unpack('C4'),
89
+ 51, 4, *[@lease_time].pack('N').unpack('C4'),
90
+ 1, 4, *IPAddr.new(@subnet_mask).hton.unpack('C4'),
91
+ 3, 4, *IPAddr.new(@ip).hton.unpack('C4'),
92
+ 6, 4, *@dns_servers,
93
+ 15, @domain_name.bytes.size, *@domain_name.bytes,
94
+ 28, 4, *IPAddr.new(@broadcast_addr).hton.unpack('C4'),
95
+ 255
96
+ ].flatten.pack('C*').b
97
+
98
+ response = [
99
+ 0x02.chr.force_encoding('BINARY'),
100
+ 0x01.chr.force_encoding('BINARY'),
101
+ 0x06.chr.force_encoding('BINARY'),
102
+ 0x00.chr.force_encoding('BINARY'),
103
+ xid,
104
+ [0].pack('n').b,
105
+ [0x8000].pack('n').b,
106
+ "\x00\x00\x00\x00".b,
107
+ IPAddr.new(lease[:ip]).hton.b,
108
+ IPAddr.new(@ip).hton.b,
109
+ "\x00\x00\x00\x00".b,
110
+ data[28..43].b,
111
+ ("\x00" * 64).b,
112
+ ("\x00" * 128).b,
113
+ "\x63\x82\x53\x63".b,
114
+ dhcp_options
115
+ ].join
116
+
117
+ socket.send(response, 0, @broadcast_addr, 68)
118
+ client_ip = lease[:ip]
119
+
120
+ # Mostrar información del dispositivo
121
+ puts "\n\n\r\033[38;5;46m[\e[1;37m+\033[38;5;46m]\e[1;37m" ' ' + "Dispositive: \033[38;5;51m#{lease[:hostname]}\e[1;37m | " + "IP: \033[38;5;118m#{client_ip}\e[1;37m | " + "MAC: \033[38;5;214m#{mac}\e[1;37m" + ' ' + 'connected'
122
+ puts "\n"
123
+ print "\r\033[38;5;236m\e[0m\033[48;5;236m " + "\033[38;5;196mwibrfake  #{@iface} \e[0m" + "\033[38;5;236m\e[0m "
124
+ File.open(File.join(File.dirname(__FILE__), '..', 'Tmp', @id, 'clients', 'clients.log'), 'a'){|file|
125
+ file.write "#{Time.now}, Hostname: #{lease[:hostname]}, IP: #{client_ip}, Mac: #{mac}, connect\n"
126
+ }
127
+ File.open(File.join(File.dirname(__FILE__), '..', 'Tmp', @id, 'clients', 'clients_connected.log'), 'a'){|file|
128
+ file.write "#{lease[:hostname]}, #{client_ip}, #{mac}\n"
129
+ if(File.exist?(File.join(File.dirname(__FILE__), '..', 'Tmp', @id, 'clients', 'clients_disconnected.log')))
130
+ File.open(File.join(File.dirname(__FILE__), '..', 'Tmp', @id, 'clients', 'clients_disconnected.log'), 'r+'){|log|
131
+ lines = log.readlines
132
+ if lines.any? {|lin| lin.include?(mac)}
133
+ lines.reject! { |linefile| linefile.include?(mac) }
134
+ end
135
+ log.rewind
136
+ log.write(lines.join)
137
+ log.truncate(log.pos)
138
+ }
139
+ end
140
+ }
141
+ end
142
+ end
143
+ end
144
+ rescue Interrupt
145
+ puts "\n[!] Servidor detenido"
146
+ socket.close
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,135 @@
1
+ require 'socket'
2
+ require 'ipaddr'
3
+
4
+ # Configuración
5
+ server_ip = '192.168.1.1'
6
+ subnet_mask = '255.255.255.0'
7
+ broadcast_addr = '192.168.1.255'
8
+ lease_time = 3600 # 1 hora
9
+ dns_servers = ['192.168.1.1'].map { |ip| IPAddr.new(ip).hton.unpack('C4') }.flatten # ¡DNS local!
10
+ domain_name = "local"
11
+ ip_pool = (2..254).cycle
12
+
13
+ socket = UDPSocket.new
14
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
15
+ socket.bind('0.0.0.0', 67)
16
+
17
+ puts "[+] Servidor DHCP escuchando en puerto 67..."
18
+
19
+ leases = {}
20
+
21
+ begin
22
+ loop do
23
+ data, client = socket.recvfrom(1024)
24
+ next unless data[0].ord == 1
25
+
26
+ mac = data[28..33].unpack('H2H2H2H2H2H2').join(':')
27
+ xid = data[4..7].b
28
+
29
+ # Parsear opciones DHCP
30
+ options = data[240..-1].b
31
+ msg_type = nil
32
+ index = 0
33
+
34
+ while index < options.size
35
+ tag = options[index].ord
36
+ break if tag == 255
37
+
38
+ if tag == 53
39
+ len = options[index + 1].ord
40
+ msg_type = options[index + 2].ord
41
+ break
42
+ end
43
+
44
+ len = options[index + 1].ord rescue 0
45
+ index += 2 + len
46
+ end
47
+
48
+ if msg_type == 1
49
+ puts "DHCP Discover de #{mac}"
50
+ offered_ip = "192.168.1.#{ip_pool.next}"
51
+ leases[mac] = offered_ip
52
+
53
+ # Construir DHCP Offer
54
+ dhcp_options = [
55
+ 53, 1, 2, # DHCP Offer
56
+ 54, 4, *IPAddr.new(server_ip).hton.unpack('C4'), # Server IP
57
+ 51, 4, *[lease_time].pack('N').unpack('C4'), # Lease Time
58
+ 1, 4, *IPAddr.new(subnet_mask).hton.unpack('C4'), # Subnet Mask
59
+ 3, 4, *IPAddr.new(server_ip).hton.unpack('C4'), # Gateway (Router)
60
+ 6, 4, *dns_servers, # DNS Servers
61
+ 15, domain_name.bytes.size, *domain_name.bytes, # Domain Name
62
+ 28, 4, *IPAddr.new(broadcast_addr).hton.unpack('C4'), # Broadcast Address
63
+ 255 # End
64
+ ].flatten.pack('C*').b
65
+
66
+ response = [
67
+ 0x02.chr.force_encoding('BINARY'), # Opcode: Boot Reply
68
+ 0x01.chr.force_encoding('BINARY'), # Hardware Type: Ethernet
69
+ 0x06.chr.force_encoding('BINARY'), # Hardware Address Length
70
+ 0x00.chr.force_encoding('BINARY'), # Hops
71
+ xid, # Transaction ID
72
+ [0].pack('n').b, # Seconds Elapsed
73
+ [0x8000].pack('n').b, # Flags: Broadcast
74
+ "\x00\x00\x00\x00".b, # Client IP Address (0.0.0.0)
75
+ IPAddr.new(offered_ip).hton.b, # Your IP Address
76
+ IPAddr.new(server_ip).hton.b, # Server IP Address
77
+ "\x00\x00\x00\x00".b, # Gateway IP Address
78
+ data[28..43].b, # Client MAC Address
79
+ ("\x00" * 64).b, # Server Name
80
+ ("\x00" * 128).b, # Boot File Name
81
+ "\x63\x82\x53\x63".b, # Magic Cookie
82
+ dhcp_options
83
+ ].join
84
+
85
+ socket.send(response, 0, broadcast_addr, 68)
86
+ puts "Enviado DHCP Offer para #{offered_ip}"
87
+
88
+ elsif msg_type == 3
89
+ puts "DHCP Request de #{mac}"
90
+ client_ip = leases[mac]
91
+
92
+ if client_ip
93
+ # Construir DHCP Ack
94
+ dhcp_options = [
95
+ 53, 1, 5, # DHCP Ack
96
+ 54, 4, *IPAddr.new(server_ip).hton.unpack('C4'), # Server IP
97
+ 51, 4, *[lease_time].pack('N').unpack('C4'), # Lease Time
98
+ 1, 4, *IPAddr.new(subnet_mask).hton.unpack('C4'), # Subnet Mask
99
+ 3, 4, *IPAddr.new(server_ip).hton.unpack('C4'), # Gateway (Router)
100
+ 6, 4, *dns_servers, # DNS Servers
101
+ 15, domain_name.bytes.size, *domain_name.bytes, # Domain Name
102
+ 28, 4, *IPAddr.new(broadcast_addr).hton.unpack('C4'), # Broadcast Address
103
+ 255 # End
104
+ ].flatten.pack('C*').b
105
+
106
+ response = [
107
+ 0x02.chr.force_encoding('BINARY'),
108
+ 0x01.chr.force_encoding('BINARY'),
109
+ 0x06.chr.force_encoding('BINARY'),
110
+ 0x00.chr.force_encoding('BINARY'),
111
+ xid,
112
+ [0].pack('n').b,
113
+ [0x8000].pack('n').b,
114
+ "\x00\x00\x00\x00".b,
115
+ IPAddr.new(client_ip).hton.b,
116
+ IPAddr.new(server_ip).hton.b,
117
+ "\x00\x00\x00\x00".b,
118
+ data[28..43].b,
119
+ ("\x00" * 64).b,
120
+ ("\x00" * 128).b,
121
+ "\x63\x82\x53\x63".b,
122
+ dhcp_options
123
+ ].join
124
+
125
+ socket.send(response, 0, broadcast_addr, 68)
126
+ puts "Enviado DHCP Ack para #{client_ip}"
127
+ else
128
+ puts "Cliente no reconocido: #{mac}"
129
+ end
130
+ end
131
+ end
132
+ rescue Interrupt
133
+ puts "\n[!] Servidor detenido"
134
+ socket.close
135
+ end
@@ -0,0 +1,34 @@
1
+ module DNS
2
+ def dns
3
+ socket = UDPSocket.new
4
+ socket.bind('0.0.0.0', 53)
5
+
6
+ #puts "[+] DNS Server listening on port 53..."
7
+
8
+ begin
9
+ loop do
10
+ data, client = socket.recvfrom(1024)
11
+ #"Consulta DNS de #{client[3]}"
12
+ transaction_id = data[0..1]
13
+ flags = "\x85\x80".b # QR=1 (Respuesta), AA=1 (Autoritativo), RD=1, RA=1
14
+ questions = data[4..5]
15
+ answer_rrs = "\x00\x01".b # 1 respuesta
16
+ authority_rrs = "\x00\x00".b
17
+ additional_rrs = "\x00\x00".b
18
+ query = data[12..-1]
19
+ answer = "\xc0\x0c".b + # Nombre comprimido (apunta a la consulta)
20
+ "\x00\x01".b + # Tipo A
21
+ "\x00\x01".b + # Clase IN
22
+ [300].pack('N') + # TTL (5 minutos)
23
+ "\x00\x04".b + # Longitud de la IP (4 bytes)
24
+ IPAddr.new(@ip).hton # IP del servidor
25
+
26
+ response = [transaction_id, flags, questions, answer_rrs, authority_rrs, additional_rrs, query, answer].join
27
+ socket.send(response, 0, client[3], client[1])
28
+ end
29
+ rescue Interrupt
30
+ #puts "\n[!] Servidor DNS detenido"
31
+ socket.close
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ # dns.rb (Versión corregida)
2
+ require 'socket'
3
+ require 'ipaddr'
4
+
5
+ socket = UDPSocket.new
6
+ socket.bind('0.0.0.0', 53)
7
+
8
+ puts "[+] DNS Server listening on port 53..."
9
+
10
+ begin
11
+ loop do
12
+ data, client = socket.recvfrom(1024)
13
+ puts "Consulta DNS de #{client[3]}"
14
+
15
+ # Construir respuesta DNS
16
+ transaction_id = data[0..1]
17
+ flags = "\x85\x80".b # QR=1 (Respuesta), AA=1 (Autoritativo), RD=1, RA=1
18
+ questions = data[4..5]
19
+ answer_rrs = "\x00\x01".b # 1 respuesta
20
+ authority_rrs = "\x00\x00".b
21
+ additional_rrs = "\x00\x00".b
22
+ query = data[12..-1]
23
+ answer = "\xc0\x0c".b + # Nombre comprimido (apunta a la consulta)
24
+ "\x00\x01".b + # Tipo A
25
+ "\x00\x01".b + # Clase IN
26
+ [300].pack('N') + # TTL (5 minutos)
27
+ "\x00\x04".b + # Longitud de la IP (4 bytes)
28
+ IPAddr.new("192.168.1.1").hton # IP del servidor
29
+
30
+ response = [transaction_id, flags, questions, answer_rrs, authority_rrs, additional_rrs, query, answer].join
31
+ socket.send(response, 0, client[3], client[1])
32
+ end
33
+ rescue Interrupt
34
+ puts "\n[!] Servidor DNS detenido"
35
+ socket.close
36
+ end
@@ -0,0 +1,33 @@
1
+ begin
2
+ require_relative 'dhcp'
3
+ require_relative 'dns'
4
+ rescue LoadError => e
5
+ puts e.message
6
+ puts "load error for gem"
7
+ end
8
+ module WibrFake
9
+ class Dnsmasq
10
+ include DNS
11
+ include DHCP
12
+ def initialize(ipaddr, id, iface)
13
+ begin
14
+ require 'socket'
15
+ require 'ipaddr'
16
+ rescue LoadError
17
+ puts e.message
18
+ end
19
+ @iface = iface
20
+ @ipaddr = ipaddr
21
+ @ip = ipaddr.to_s
22
+ @ip_vac = ipaddr.vac
23
+ @dns_servers = [@ip].map { |ip| IPAddr.new(ip).hton.unpack('C4') }.flatten
24
+ @subnet_mask = ipaddr.mask
25
+ @broadcast_addr = ipaddr.succ("255")
26
+ @domain_name = "local"
27
+ @lease_time = 3600
28
+ @id = id
29
+ @dir_clients = File.join(File.dirname(__FILE__), '..', 'Tmp', id, 'clients')
30
+ Dir.mkdir(@dir_clients) unless(Dir.exist?(@dir_clients))
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ module WibrFake
2
+ class Listing
3
+ def self.apfake_show(configAP, iface)
4
+ puts "Set options for the access point:"
5
+ puts
6
+ puts " " * 2 + "#{'Name' + ' ' * 6} | #{' ' + 'Current Setting' + ' ' * 6} | #{'Required' + ' ' * 6} | #{'Description' + ' ' * 6}"
7
+ puts " " * 2 + "----" + " " * 10 + "---------------"
8
+ puts " iface" + " " * 9 + iface.ljust(26) + "yes".ljust(3) + " " * 12 + "Interface network"
9
+ puts " ssid" + " " * 10 + configAP.ssid.ljust(26) + "yes".ljust(3) + " " * 12 + "Access point name"
10
+ puts " wp" + " " * 12 + configAP.wpa.to_s.ljust(26) + "no".ljust(3) + " " * 12 + "The type of wpa authentication"
11
+ puts " driver" + " " * 8 + configAP.driver.ljust(26) + "yes".ljust(3) + " " * 12 + "Specifies the network driver to be used"
12
+ if(!configAP.wpa.nil?) and (configAP.wpa_wep.nil?)
13
+ puts " password" + " " * 6 + configAP.password.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "Access Point Password"
14
+ puts " pairwise" + " " * 6 + configAP.wpa_pairwise.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "The encryption type used with WPA2"
15
+ puts " key_mgmt" + " " * 6 + configAP.wpa_key_mgmt.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "Key management method"
16
+ puts " rekey" + " " * 9 + configAP.wpa_rekey.to_s.ljust(26) + "no".ljust(3) + " " * 12 + "Sets the interval for renewing the GTK"
17
+ end
18
+ puts " gateway" + " " * 7 + configAP.ipaddr.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "Setting the router IP"
19
+ puts " mask" + " " * 10 + configAP.ipaddr.mask.ljust(26) + "yes".ljust(3) + " " * 12 + "Configure the netmask"
20
+ puts " channel" + " " * 7 + configAP.channel.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "Access Point Channel"
21
+ puts " hw_mode" + " " * 7 + configAP.hw_mode.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "The operating mode of the hardware"
22
+ puts " auth_algs" + " " * 5 + configAP.auth_algs.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "Allowed authentication algorithms"
23
+ puts " mww" + " " * 11 + configAP.wmm.to_s.ljust(26) + "yes".ljust(3) + " " * 12 + "Optimizes performance for multiple Wi-Fi connections"
24
+ puts " macaddr_acl" + " " * 3 + configAP.macaddr_acl.to_s.ljust(26) + "no".ljust(3) + " " * 12 + "Access denied for Mac addresses"
25
+ puts " ignore_ssid" + " " * 3 + configAP.ignore_ssid.ljust(26) + "no".ljust(3) + " " * 12 + "Ignore SSID for access point"
26
+ end
27
+ end
28
+ end