pwn 0.5.78 → 0.5.80

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b57135402de7840253a3e48cc4a50508507b66b03af3559b4de891eac1a9ebd
4
- data.tar.gz: 7c6d44884e7df371dc3cbbaf77bef4ad7750ecdde5f659286f0dff1ccb469c12
3
+ metadata.gz: 3923f535fc7ac63c41eaaaebaf15f02188e32a0778fcf27affde56ee0091e3f9
4
+ data.tar.gz: 8318c7472b97602a04eac191973dd16f3cf8d919d7b8dfc4ff209b1ada2a6d80
5
5
  SHA512:
6
- metadata.gz: 461e5365cfa2d10f28f610fd350ce9ef596727f3f391c0c1eca26cf38d7bc9353278e0055760181a8b8af3ef5a0bc5642c6eaa6ad1c4137a8b648b2c3ee05ef6
7
- data.tar.gz: 427eaddc5130d6cf30c6f4aff5a9a58ee4565043df82613c1de2a5e41feaf824a43f0364cb3fadc94fcaa5dede605298bea5f849d148da0306de0edf4b517784
6
+ metadata.gz: 38311d9cf2164aefe9deaa6b73b74c060e02663706df322dfdcb447351a61c5467fbf59f9f8691e88777c2022cd4d2eaeeedb23e0412ccf0730db70dfdfdc54f
7
+ data.tar.gz: 01df4c1b51c6872fbf24dd0d9f52208736bb6cda8cccf32062298c870b62359a24c1ed998c37b70d9ab4b40eb6eaefa298011317ebcdeea6386372ca77c59b7d
data/Gemfile CHANGED
@@ -34,11 +34,12 @@ gem 'gdb', '1.0.0'
34
34
  gem 'gem-wrappers', '1.4.0'
35
35
  gem 'gist', '6.0.0'
36
36
  gem 'gruff', '0.24.0'
37
+ # gem 'hidapi', '0.1.9'
37
38
  gem 'htmlentities', '4.3.4'
38
39
  gem 'ipaddress', '0.8.3'
39
40
  gem 'jenkins_api_client2', '1.9.0'
40
41
  gem 'js-beautify', '0.1.8'
41
- gem 'json', '2.7.1'
42
+ gem 'json', '2.7.2'
42
43
  gem 'jsonpath', '1.1.5'
43
44
  gem 'jwt', '2.8.1'
44
45
  gem 'libusb', '0.6.4'
@@ -75,7 +76,7 @@ gem 'rspec', '3.13.0'
75
76
  gem 'rtesseract', '3.1.3'
76
77
  gem 'rubocop', '1.62.1'
77
78
  gem 'rubocop-rake', '0.6.0'
78
- gem 'rubocop-rspec', '2.28.0'
79
+ gem 'rubocop-rspec', '2.29.1'
79
80
  gem 'ruby-audio', '1.6.1'
80
81
  gem 'ruby-nmap', '1.0.3'
81
82
  gem 'ruby-saml', '1.16.0'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ cd /opt/pwn
37
37
  $ ./install.sh
38
38
  $ ./install.sh ruby-gem
39
39
  $ pwn
40
- pwn[v0.5.78]:001 >>> PWN.help
40
+ pwn[v0.5.80]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.3.0@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.5.78]:001 >>> PWN.help
55
+ pwn[v0.5.80]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
  If you're using a multi-user install of RVM do:
@@ -62,7 +62,7 @@ $ rvm use ruby-3.3.0@pwn
62
62
  $ rvmsudo gem uninstall --all --executables pwn
63
63
  $ rvmsudo gem install --verbose pwn
64
64
  $ pwn
65
- pwn[v0.5.78]:001 >>> PWN.help
65
+ pwn[v0.5.80]:001 >>> PWN.help
66
66
  ```
67
67
 
68
68
  PWN periodically upgrades to the latest version of Ruby which is reflected in `/opt/pwn/.ruby-version`. The easiest way to upgrade to the latest version of Ruby from a previous PWN installation is to run the following script:
data/bin/pwn_gqrx_scanner CHANGED
@@ -11,7 +11,15 @@ OptionParser.new do |options|
11
11
  #{$PROGRAM_NAME} [opts]
12
12
  "
13
13
 
14
- options.on('-tFREQ', '--target-freq=FREQ', '<Required - Frequency to Conclude Scanning (e.g. 900000000 == 900 mHz>') do |e|
14
+ options.on('-aPROFILE', '--assume-profile=PROFILE', '<Required if "--target-freq" is Nil - Profile to assume for common radio protocols. Use "--list-profiles" to display supported protocols (Defaults to nil)') do |p|
15
+ opts[:profile] = p
16
+ end
17
+
18
+ options.on('-l', '--list-profiles', '<Optional - List supported profiles and exit>') do |l|
19
+ opts[:list_profiles] = l
20
+ end
21
+
22
+ options.on('-tFREQ', '--target-freq=FREQ', '<Required if "--assume-profile" is Nil - Frequency to Conclude Scanning (e.g. 900.000.000 == 900 mHz>') do |e|
15
23
  opts[:target_freq] = e
16
24
  end
17
25
 
@@ -35,7 +43,7 @@ OptionParser.new do |options|
35
43
  opts[:bandwidth] = b
36
44
  end
37
45
 
38
- options.on('-DMODE', '--demodulator-mode=MODE', '<Optional - Set Demodulator ModeOFF | RAW | AM | FM | WFM | WFM_ST | WFM_ST_OIRT | LSB |USB | CW | CWL | CWU (Defaults to WFM_ST)>') do |d|
46
+ options.on('-DMODE', '--demodulator-mode=MODE', '<Optional - Set Demodulator Mode OFF | RAW | AM | FM | WFM | WFM_ST | WFM_ST_OIRT | LSB | USB | CW | CWL | CWU (Defaults to WFM_ST)>') do |d|
39
47
  opts[:demodulator_mode] = d
40
48
  end
41
49
 
@@ -77,10 +85,19 @@ begin
77
85
  pwn_provider = 'ruby-gem'
78
86
  pwn_provider = ENV.fetch('PWN_PROVIDER') if ENV.keys.any? { |s| s == 'PWN_PROVIDER' }
79
87
 
88
+ list_profiles = opts[:list_profiles]
89
+ if list_profiles
90
+ pp PWN::Plugins::GQRX.list_profiles
91
+ exit 0
92
+ end
93
+
94
+ profile = opts[:profile]
95
+ opts = PWN::Plugins::GQRX.assume_profile(profile: profile) unless profile.nil?
96
+
80
97
  target_freq = opts[:target_freq]
81
98
  target_freq = target_freq.to_s.delete('.') unless target_freq.nil?
82
99
  target_freq = target_freq.to_i
83
- raise "ERROR: Invalid target frequency #{target_freq}" if target_freq.zero?
100
+ raise 'ERROR: --assume-profile || --target-freq is required.' if target_freq.zero? && profile.nil?
84
101
 
85
102
  host = opts[:host]
86
103
  port = opts[:port]
@@ -178,5 +195,5 @@ rescue StandardError => e
178
195
  rescue Interrupt, SystemExit
179
196
  puts "\nGoodbye."
180
197
  ensure
181
- gqrx_sock = PWN::Plugins::GQRX.disconnect(gqrx_sock: gqrx_sock)
198
+ gqrx_sock = PWN::Plugins::GQRX.disconnect(gqrx_sock: gqrx_sock) unless gqrx_sock.nil?
182
199
  end
@@ -473,7 +473,7 @@ module PWN
473
473
 
474
474
  valid_group_by = %w[
475
475
  component_name
476
- component_name+compoent_version
476
+ component_name+component_version
477
477
  file_path
478
478
  finding_title
479
479
  ]
@@ -23,7 +23,7 @@ module PWN
23
23
  # Supported Method Parameters::
24
24
  # gqrx_resp = PWN::Plugins::GQRX.gqrx_cmd(
25
25
  # gqrx_sock: 'required - GQRX socket object returned from #connect method',
26
- # cmd: 'required - GQRX command to execute'
26
+ # cmd: 'required - GQRX command to execute',
27
27
  # resp_ok: 'optional - Expected response from GQRX to indicate success'
28
28
  # )
29
29
 
@@ -328,6 +328,212 @@ module PWN
328
328
  end
329
329
  end
330
330
 
331
+ # Supported Method Parameters::
332
+ # profiles = PWN::Plugins::GQRX.list_profiles
333
+ public_class_method def self.list_profiles
334
+ {
335
+ ads_b: 'ADS-B, 978mhz to 1090mhz, AM, 4.6mhz bandwidth',
336
+ analogue_tv: 'Analogue TV, 55.25mhz to 801.25mhz, WFM, 6mhz bandwidth',
337
+ am_radio: 'AM Radio, 540khz to 1600khz, AM, 6khz bandwidth',
338
+ bluetooth: 'Bluetooth, 2.4ghz to 2.5ghz, AM, 1mhz bandwidth',
339
+ cdma: 'CDMA, 824mhz to 849mhz, AM, 1.25mhz bandwidth',
340
+ cw20: 'CW 20m, 14mhz to 14.35mhz, CW, 150hz bandwidth',
341
+ cw40: 'CW 40m, 7mhz to 7.3mhz, CW, 150hz bandwidth',
342
+ cw80: 'CW 80m, 3.5mhz to 3.8mhz, CW, 150hz bandwidth',
343
+ gps: 'GPS, 1.57542ghz to 1.57545ghz, WFM, 9.6mhz bandwidth',
344
+ gsm: 'GSM, 935mhz to 960mhz, AM, 200khz bandwidth',
345
+ fm_radio: 'FM Radio, 88mhz to 108mhz, WFM, 200khz bandwidth',
346
+ lora433: 'LoRa 433mhz, 433mhz, AM, 125khz bandwidth',
347
+ lora915: 'LoRa 915mhz, 915mhz, AM, 125khz bandwidth',
348
+ lowrfid: 'Low RFID, 125khz, AM, 200khz bandwidth',
349
+ nfcrfid: 'NFC RFID, 13.56mhz, AM, 1mhz bandwidth',
350
+ radio_fob: 'Radio FOB, 315mhz, AM',
351
+ rtty20: 'RTTY 20m, 14mhz to 14.35mhz, RTTY, 170hz bandwidth',
352
+ rtty40: 'RTTY 40m, 7mhz to 7.3mhz, RTTY, 170hz bandwidth',
353
+ rtty80: 'RTTY 80m, 3.5mhz to 3.8mhz, RTTY, 170hz bandwidth',
354
+ ssb10: 'SSB 10m, 28mhz to 29.7mhz, USB, 2.7khz bandwidth',
355
+ ssb12: 'SSB 12m, 24.89mhz to 24.99mhz, USB, 2.7khz bandwidth',
356
+ ssb15: 'SSB 15m, 21mhz to 21.45mhz, USB, 2.7khz bandwidth',
357
+ ssb17: 'SSB 17m, 18.068mhz to 18.168mhz, USB, 2.7khz bandwidth',
358
+ ssb20: 'SSB 20m, 14mhz to 14.35mhz, USB, 2.7khz bandwidth',
359
+ ssb40: 'SSB 40m, 7mhz to 7.3mhz, LSB, 2.7khz bandwidth',
360
+ ssb80: 'SSB 80m, 3.5mhz to 3.8mhz, LSB, 2.7khz bandwidth',
361
+ ssb160: 'SSB 160m, 1.8mhz to 2mhz, LSB, 2.7khz bandwidth',
362
+ tempest: 'Tempest, 400mhz to 430mhz, AM, 200khz bandwidth',
363
+ wifi24: 'WiFi 2.4ghz, 2.4ghz to 2.5ghz, AM, 20mhz bandwidth',
364
+ zigbee: 'Zigbee, 2.405ghz to 2.485ghz, AM, 2mhz bandwidth'
365
+ }
366
+ rescue StandardError => e
367
+ raise e
368
+ end
369
+
370
+ # Supported Method Parameters::
371
+ # opts = PWN::Plugins::GQRX.assume_profile(
372
+ # profile: 'required - valid GQRX profile name returned from #list_profiles method'
373
+ # )
374
+ public_class_method def self.assume_profile(opts = {})
375
+ profile = opts[:profile].to_s.to_sym
376
+
377
+ opts = {}
378
+ case profile
379
+ when :ads_b
380
+ opts[:start_freq] = '978.000.000'
381
+ opts[:target_freq] = '1.090.000.000'
382
+ opts[:demodulator_mode] = 'AM'
383
+ opts[:bandwidth] = '4.600.000'
384
+ when :analogue_tv
385
+ opts[:start_freq] = '55.250.000'
386
+ opts[:target_freq] = '801.250.000'
387
+ opts[:demodulator_mode] = 'WFM'
388
+ opts[:bandwidth] = '6.000'
389
+ when :am_radio
390
+ opts[:start_freq] = '540.000'
391
+ opts[:target_freq] = '1.600.000'
392
+ opts[:demodulator_mode] = 'AM'
393
+ opts[:bandwidth] = '6.000'
394
+ when :bluetooth
395
+ opts[:start_freq] = '2.400.000.000'
396
+ opts[:target_freq] = '2.500.000.000'
397
+ opts[:demodulator_mode] = 'AM'
398
+ opts[:bandwidth] = '1.000.000'
399
+ when :cdma
400
+ opts[:start_freq] = '824.000.000'
401
+ opts[:target_freq] = '849.000.000'
402
+ opts[:demodulator_mode] = 'AM'
403
+ opts[:bandwidth] = '1.250.000'
404
+ when :cw20
405
+ opts[:start_freq] = '14.000.000'
406
+ opts[:target_freq] = '14.350.000'
407
+ opts[:demodulator_mode] = 'CW'
408
+ opts[:bandwidth] = '150'
409
+ when :cw40
410
+ opts[:start_freq] = '7.000.000'
411
+ opts[:target_freq] = '7.300.000'
412
+ opts[:demodulator_mode] = 'CW'
413
+ opts[:bandwidth] = '150'
414
+ when :cw80
415
+ opts[:start_freq] = '3.500.000'
416
+ opts[:target_freq] = '3.800.000'
417
+ opts[:demodulator_mode] = 'CW'
418
+ opts[:bandwidth] = '150'
419
+ when :gps
420
+ opts[:start_freq] = '1.575.420.000'
421
+ opts[:target_freq] = '1.575.450.000'
422
+ opts[:demodulator_mode] = 'WFM'
423
+ opts[:bandwidth] = '9.600.000'
424
+ when :gsm
425
+ opts[:start_freq] = '935.000.000'
426
+ opts[:target_freq] = '960.000.000'
427
+ opts[:demodulator_mode] = 'AM'
428
+ opts[:bandwidth] = '200.000'
429
+ when :fm_radio
430
+ opts[:start_freq] = '88.000.000'
431
+ opts[:target_freq] = '108.000.000'
432
+ opts[:demodulator_mode] = 'WFM'
433
+ opts[:bandwidth] = '200.000'
434
+ when :lora433
435
+ opts[:start_freq] = '433.000.000'
436
+ opts[:target_freq] = '433.000.000'
437
+ opts[:demodulator_mode] = 'AM'
438
+ opts[:bandwidth] = '125.000'
439
+ when :lora915
440
+ opts[:start_freq] = '915.000.000'
441
+ opts[:target_freq] = '915.000.000'
442
+ opts[:demodulator_mode] = 'AM'
443
+ opts[:bandwidth] = '125.000'
444
+ when :lowrfid
445
+ opts[:start_freq] = '125.000'
446
+ opts[:target_freq] = '125.000'
447
+ opts[:demodulator_mode] = 'AM'
448
+ opts[:bandwidth] = '200.000'
449
+ when :nfcrfid
450
+ opts[:start_freq] = '13.560.000'
451
+ opts[:target_freq] = '13.560.000'
452
+ opts[:demodulator_mode] = 'AM'
453
+ opts[:bandwidth] = '1.000.000'
454
+ when :radio_fob
455
+ opts[:start_freq] = '315.000.000'
456
+ opts[:target_freq] = '315.000.000'
457
+ opts[:demodulator_mode] = 'AM'
458
+ when :rtty20
459
+ opts[:start_freq] = '14.000.000'
460
+ opts[:target_freq] = '14.350.000'
461
+ opts[:demodulator_mode] = 'RTTY'
462
+ opts[:bandwidth] = '170'
463
+ when :rtty40
464
+ opts[:start_freq] = '7.000.000'
465
+ opts[:target_freq] = '7.300.000'
466
+ opts[:demodulator_mode] = 'RTTY'
467
+ opts[:bandwidth] = '170'
468
+ when :rtty80
469
+ opts[:start_freq] = '3.500.000'
470
+ opts[:target_freq] = '3.800.000'
471
+ opts[:demodulator_mode] = 'RTTY'
472
+ opts[:bandwidth] = '170'
473
+ when :ssb10
474
+ opts[:start_freq] = '28.000.000'
475
+ opts[:target_freq] = '29.700.000'
476
+ opts[:demodulator_mode] = 'USB'
477
+ opts[:bandwidth] = '2.700'
478
+ when :ssb12
479
+ opts[:start_freq] = '24.890.000'
480
+ opts[:target_freq] = '24.990.000'
481
+ opts[:demodulator_mode] = 'USB'
482
+ opts[:bandwidth] = '2.700'
483
+ when :ssb15
484
+ opts[:start_freq] = '21.000.000'
485
+ opts[:target_freq] = '21.450.000'
486
+ opts[:demodulator_mode] = 'USB'
487
+ opts[:bandwidth] = '2.700'
488
+ when :ssb17
489
+ opts[:start_freq] = '18.068.000'
490
+ opts[:target_freq] = '18.168.000'
491
+ opts[:demodulator_mode] = 'USB'
492
+ opts[:bandwidth] = '2.700'
493
+ when :ssb20
494
+ opts[:start_freq] = '14.000.000'
495
+ opts[:target_freq] = '14.350.000'
496
+ opts[:demodulator_mode] = 'USB'
497
+ opts[:bandwidth] = '2.700'
498
+ when :ssb40
499
+ opts[:start_freq] = '7.000.000'
500
+ opts[:target_freq] = '7.300.000'
501
+ opts[:demodulator_mode] = 'LSB'
502
+ opts[:bandwidth] = '2.700'
503
+ when :ssb80
504
+ opts[:start_freq] = '3.500.000'
505
+ opts[:target_freq] = '3.800.000'
506
+ opts[:demodulator_mode] = 'LSB'
507
+ opts[:bandwidth] = '2.700'
508
+ when :ssb160
509
+ opts[:start_freq] = '1.800.000'
510
+ opts[:target_freq] = '2.000.000'
511
+ opts[:demodulator_mode] = 'LSB'
512
+ opts[:bandwidth] = '2.700'
513
+ when :tempest
514
+ opts[:start_freq] = '400.000.000'
515
+ opts[:target_freq] = '430.000.000'
516
+ opts[:demodulator_mode] = 'AM'
517
+ opts[:bandwidth] = '200.000'
518
+ when :wifi24
519
+ opts[:start_freq] = '2.400.000.000'
520
+ opts[:target_freq] = '2.500.000.000'
521
+ opts[:demodulator_mode] = 'AM'
522
+ opts[:bandwidth] = '20.000.000'
523
+ when :zigbee
524
+ opts[:start_freq] = '2.405.000.000'
525
+ opts[:target_freq] = '2.485.000.000'
526
+ opts[:demodulator_mode] = 'AM'
527
+ opts[:bandwidth] = '2.000.000'
528
+ else
529
+ raise "ERROR: Invalid profile: #{profile}"
530
+ end
531
+
532
+ opts
533
+ rescue StandardError => e
534
+ raise e
535
+ end
536
+
331
537
  # Supported Method Parameters::
332
538
  # PWN::Plugins::GQRX.disconnect(
333
539
  # gqrx_sock: 'required - GQRX socket object returned from #connect method'
@@ -352,6 +558,46 @@ module PWN
352
558
 
353
559
  public_class_method def self.help
354
560
  puts "USAGE:
561
+ gqrx_sock = #{self}.connect(
562
+ target: 'optional - GQRX target IP address (defaults to 127.0.0.1)',
563
+ port: 'optional - GQRX target port (defaults to 7356)'
564
+ )
565
+
566
+ #{self}.gqrx_cmd(
567
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
568
+ cmd: 'required - GQRX command to execute',
569
+ resp_ok: 'optional - Expected response from GQRX to indicate success'
570
+ )
571
+
572
+ #{self}.init_freq(
573
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
574
+ freq: 'required - Frequency to set',
575
+ demodulator_mode: 'optional - Demodulator mode (defaults to WFM)',
576
+ bandwidth: 'optional - Bandwidth (defaults to 200000)',
577
+ lock_freq_duration: 'optional - Lock frequency duration (defaults to 0.5)',
578
+ strength_lock: 'optional - Strength lock (defaults to -60.0)'
579
+ )
580
+
581
+ #{self}.scan_range(
582
+ gqrx_sock: 'required - GQRX socket object returned from #connect method',
583
+ demodulator_mode: 'required - Demodulator mode',
584
+ bandwidth: 'required - Bandwidth',
585
+ start_freq: 'required - Starting frequency',
586
+ target_freq: 'required - Target frequency',
587
+ precision: 'required - Precision',
588
+ lock_freq_duration: 'optional - Lock frequency duration (defaults to 0.5)',
589
+ strength_lock: 'optional - Strength lock (defaults to -60.0)'
590
+ )
591
+
592
+ profiles = #{self}.list_profiles
593
+
594
+ opts = #{self}.assume_profile(
595
+ profile: 'required - valid GQRX profile name returned from #list_profiles method'
596
+ )
597
+
598
+ #{self}.disconnect(
599
+ gqrx_sock: 'required - GQRX socket object returned from #connect method'
600
+ )
355
601
 
356
602
  #{self}.authors
357
603
  "
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.78'
4
+ VERSION = '0.5.80'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.78
4
+ version: 0.5.80
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-03 00:00:00.000000000 Z
11
+ date: 2024-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -380,14 +380,14 @@ dependencies:
380
380
  requirements:
381
381
  - - '='
382
382
  - !ruby/object:Gem::Version
383
- version: 2.7.1
383
+ version: 2.7.2
384
384
  type: :runtime
385
385
  prerelease: false
386
386
  version_requirements: !ruby/object:Gem::Requirement
387
387
  requirements:
388
388
  - - '='
389
389
  - !ruby/object:Gem::Version
390
- version: 2.7.1
390
+ version: 2.7.2
391
391
  - !ruby/object:Gem::Dependency
392
392
  name: jsonpath
393
393
  requirement: !ruby/object:Gem::Requirement
@@ -884,14 +884,14 @@ dependencies:
884
884
  requirements:
885
885
  - - '='
886
886
  - !ruby/object:Gem::Version
887
- version: 2.28.0
887
+ version: 2.29.1
888
888
  type: :runtime
889
889
  prerelease: false
890
890
  version_requirements: !ruby/object:Gem::Requirement
891
891
  requirements:
892
892
  - - '='
893
893
  - !ruby/object:Gem::Version
894
- version: 2.28.0
894
+ version: 2.29.1
895
895
  - !ruby/object:Gem::Dependency
896
896
  name: ruby-audio
897
897
  requirement: !ruby/object:Gem::Requirement