pwn 0.5.708 → 0.5.709
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 +4 -4
- data/documentation/Installation.md +1 -0
- data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
- data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
- data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
- data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
- data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
- data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +48 -0
- data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
- data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
- data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
- data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +51 -0
- data/etc/default_skills/pwn/plugins/doctor/SKILL.md +57 -0
- data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +61 -0
- data/etc/default_skills/pwn/plugins/frida/SKILL.md +49 -0
- data/etc/default_skills/pwn/plugins/gdb/SKILL.md +52 -0
- data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
- data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +48 -0
- data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +52 -0
- data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
- data/etc/default_skills/pwn/plugins/recon/SKILL.md +55 -0
- data/etc/default_skills/pwn/plugins/recon/references/urls.md +5 -0
- data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
- data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
- data/etc/default_skills/pwn/plugins/volatility/SKILL.md +48 -0
- data/lib/pwn/ai/agent/assembly.rb +4 -1
- data/lib/pwn/ai/agent/btc.rb +4 -1
- data/lib/pwn/ai/agent/burp_suite.rb +5 -2
- data/lib/pwn/ai/agent/curriculum.rb +89 -30
- data/lib/pwn/ai/agent/dispatch.rb +27 -16
- data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
- data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
- data/lib/pwn/ai/agent/extrospection.rb +185 -60
- data/lib/pwn/ai/agent/gqrx.rb +4 -1
- data/lib/pwn/ai/agent/hacker_one.rb +5 -2
- data/lib/pwn/ai/agent/learning.rb +142 -25
- data/lib/pwn/ai/agent/loop.rb +53 -46
- data/lib/pwn/ai/agent/metrics.rb +133 -23
- data/lib/pwn/ai/agent/mistakes.rb +126 -17
- data/lib/pwn/ai/agent/open_goal.rb +25 -9
- data/lib/pwn/ai/agent/policy.rb +158 -18
- data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
- data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
- data/lib/pwn/ai/agent/reflect.rb +9 -5
- data/lib/pwn/ai/agent/registry.rb +65 -12
- data/lib/pwn/ai/agent/result.rb +19 -10
- data/lib/pwn/ai/agent/reward.rb +150 -32
- data/lib/pwn/ai/agent/sast.rb +4 -1
- data/lib/pwn/ai/agent/swarm.rb +72 -36
- data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
- data/lib/pwn/ai/agent/tool_guard.rb +105 -6
- data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
- data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
- data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
- data/lib/pwn/ai/agent.rb +4 -0
- data/lib/pwn/ai/anthropic.rb +41 -7
- data/lib/pwn/ai/gemini.rb +21 -11
- data/lib/pwn/ai/grok.rb +44 -6
- data/lib/pwn/ai/http_retry.rb +40 -12
- data/lib/pwn/ai/ollama.rb +19 -10
- data/lib/pwn/ai/open_ai.rb +81 -30
- data/lib/pwn/ai/open_web_ui.rb +20 -14
- data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
- data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
- data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
- data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
- data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
- data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
- data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
- data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
- data/lib/pwn/ai/red_team/overreliance.rb +7 -1
- data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
- data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
- data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
- data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
- data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
- data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
- data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
- data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
- data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
- data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
- data/lib/pwn/ai/red_team.rb +4 -0
- data/lib/pwn/ai.rb +4 -0
- data/lib/pwn/aws/acm.rb +5 -2
- data/lib/pwn/aws/api_gateway.rb +10 -7
- data/lib/pwn/aws/app_stream.rb +5 -2
- data/lib/pwn/aws/application_auto_scaling.rb +5 -2
- data/lib/pwn/aws/application_discovery_service.rb +5 -2
- data/lib/pwn/aws/auto_scaling.rb +5 -2
- data/lib/pwn/aws/batch.rb +5 -2
- data/lib/pwn/aws/budgets.rb +5 -2
- data/lib/pwn/aws/cloud_formation.rb +5 -2
- data/lib/pwn/aws/cloud_front.rb +7 -4
- data/lib/pwn/aws/cloud_hsm.rb +5 -2
- data/lib/pwn/aws/cloud_search.rb +5 -2
- data/lib/pwn/aws/cloud_search_domain.rb +5 -2
- data/lib/pwn/aws/cloud_trail.rb +5 -2
- data/lib/pwn/aws/cloud_watch.rb +5 -2
- data/lib/pwn/aws/cloud_watch_events.rb +5 -2
- data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
- data/lib/pwn/aws/code_build.rb +5 -2
- data/lib/pwn/aws/code_commit.rb +5 -2
- data/lib/pwn/aws/code_deploy.rb +5 -2
- data/lib/pwn/aws/code_pipeline.rb +5 -2
- data/lib/pwn/aws/cognito_identity.rb +5 -2
- data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
- data/lib/pwn/aws/cognito_sync.rb +5 -2
- data/lib/pwn/aws/config_service.rb +5 -2
- data/lib/pwn/aws/data_pipleline.rb +5 -2
- data/lib/pwn/aws/database_migration_service.rb +5 -2
- data/lib/pwn/aws/device_farm.rb +5 -2
- data/lib/pwn/aws/direct_connect.rb +5 -2
- data/lib/pwn/aws/directory_service.rb +5 -2
- data/lib/pwn/aws/dynamo_db.rb +5 -2
- data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
- data/lib/pwn/aws/ec2.rb +5 -2
- data/lib/pwn/aws/ecr.rb +5 -2
- data/lib/pwn/aws/ecs.rb +5 -2
- data/lib/pwn/aws/efs.rb +5 -2
- data/lib/pwn/aws/elasti_cache.rb +5 -2
- data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
- data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
- data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
- data/lib/pwn/aws/elastic_transcoder.rb +5 -2
- data/lib/pwn/aws/elasticsearch_service.rb +5 -2
- data/lib/pwn/aws/emr.rb +5 -2
- data/lib/pwn/aws/firehose.rb +5 -2
- data/lib/pwn/aws/game_lift.rb +5 -2
- data/lib/pwn/aws/glacier.rb +6 -3
- data/lib/pwn/aws/health.rb +5 -2
- data/lib/pwn/aws/iam.rb +10 -4
- data/lib/pwn/aws/import_export.rb +5 -2
- data/lib/pwn/aws/inspector.rb +5 -2
- data/lib/pwn/aws/iot.rb +5 -2
- data/lib/pwn/aws/iot_data_plane.rb +5 -2
- data/lib/pwn/aws/kinesis.rb +5 -2
- data/lib/pwn/aws/kinesis_analytics.rb +5 -2
- data/lib/pwn/aws/kms.rb +5 -2
- data/lib/pwn/aws/lambda.rb +5 -2
- data/lib/pwn/aws/lambda_preview.rb +5 -2
- data/lib/pwn/aws/lex.rb +5 -2
- data/lib/pwn/aws/lightsail.rb +5 -2
- data/lib/pwn/aws/machine_learning.rb +5 -2
- data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
- data/lib/pwn/aws/marketplace_metering.rb +5 -2
- data/lib/pwn/aws/ops_works.rb +5 -2
- data/lib/pwn/aws/ops_works_cm.rb +5 -2
- data/lib/pwn/aws/pinpoint.rb +5 -2
- data/lib/pwn/aws/polly.rb +5 -2
- data/lib/pwn/aws/rds.rb +5 -2
- data/lib/pwn/aws/redshift.rb +5 -2
- data/lib/pwn/aws/rekognition.rb +5 -2
- data/lib/pwn/aws/route53.rb +5 -2
- data/lib/pwn/aws/route53_domains.rb +5 -2
- data/lib/pwn/aws/s3.rb +5 -2
- data/lib/pwn/aws/service_catalog.rb +5 -2
- data/lib/pwn/aws/ses.rb +5 -2
- data/lib/pwn/aws/shield.rb +5 -2
- data/lib/pwn/aws/simple_db.rb +5 -2
- data/lib/pwn/aws/sms.rb +5 -2
- data/lib/pwn/aws/snowball.rb +5 -2
- data/lib/pwn/aws/sns.rb +5 -2
- data/lib/pwn/aws/sqs.rb +5 -2
- data/lib/pwn/aws/ssm.rb +5 -2
- data/lib/pwn/aws/states.rb +5 -2
- data/lib/pwn/aws/storage_gateway.rb +5 -2
- data/lib/pwn/aws/sts.rb +4 -1
- data/lib/pwn/aws/support.rb +5 -2
- data/lib/pwn/aws/swf.rb +5 -2
- data/lib/pwn/aws/waf.rb +5 -2
- data/lib/pwn/aws/waf_regional.rb +5 -2
- data/lib/pwn/aws/workspaces.rb +5 -2
- data/lib/pwn/aws/x_ray.rb +5 -2
- data/lib/pwn/aws.rb +4 -0
- data/lib/pwn/banner/anon.rb +3 -0
- data/lib/pwn/banner/bubble.rb +3 -0
- data/lib/pwn/banner/cheshire.rb +3 -0
- data/lib/pwn/banner/code_cave.rb +3 -0
- data/lib/pwn/banner/dont_panic.rb +3 -0
- data/lib/pwn/banner/f_society.rb +3 -0
- data/lib/pwn/banner/fork_bomb.rb +3 -0
- data/lib/pwn/banner/jmp_esp.rb +3 -0
- data/lib/pwn/banner/matrix.rb +5 -1
- data/lib/pwn/banner/ninja.rb +3 -0
- data/lib/pwn/banner/off_the_air.rb +3 -0
- data/lib/pwn/banner/pirate.rb +3 -0
- data/lib/pwn/banner/radare2.rb +3 -0
- data/lib/pwn/banner/radare2_ai.rb +3 -0
- data/lib/pwn/banner/white_rabbit.rb +3 -0
- data/lib/pwn/banner.rb +6 -2
- data/lib/pwn/blockchain/btc.rb +8 -3
- data/lib/pwn/blockchain/eth.rb +10 -3
- data/lib/pwn/blockchain.rb +4 -0
- data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
- data/lib/pwn/bounty.rb +4 -0
- data/lib/pwn/config.rb +79 -13
- data/lib/pwn/cron.rb +297 -20
- data/lib/pwn/driver.rb +2 -18
- data/lib/pwn/ffi/adalm_pluto.rb +65 -11
- data/lib/pwn/ffi/fftw.rb +31 -6
- data/lib/pwn/ffi/hack_rf.rb +59 -8
- data/lib/pwn/ffi/liquid.rb +63 -10
- data/lib/pwn/ffi/rtl_sdr.rb +35 -5
- data/lib/pwn/ffi/soapy_sdr.rb +60 -10
- data/lib/pwn/ffi/stdio.rb +5 -8
- data/lib/pwn/ffi/volk.rb +36 -7
- data/lib/pwn/ffi.rb +12 -0
- data/lib/pwn/memory.rb +136 -16
- data/lib/pwn/memory_index.rb +34 -19
- data/lib/pwn/migrate.rb +34 -24
- data/lib/pwn/module_skills.rb +39 -8
- data/lib/pwn/plugins/aflplusplus.rb +52 -0
- data/lib/pwn/plugins/android.rb +65 -245
- data/lib/pwn/plugins/artifact_registry.rb +71 -0
- data/lib/pwn/plugins/assembly.rb +9 -4
- data/lib/pwn/plugins/authentication_helper.rb +8 -5
- data/lib/pwn/plugins/baresip.rb +59 -12
- data/lib/pwn/plugins/basic_auth.rb +9 -3
- data/lib/pwn/plugins/beef.rb +28 -18
- data/lib/pwn/plugins/binary_parser.rb +133 -0
- data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
- data/lib/pwn/plugins/burp_suite.rb +98 -68
- data/lib/pwn/plugins/bus_pirate.rb +15 -8
- data/lib/pwn/plugins/char.rb +33 -3
- data/lib/pwn/plugins/credential_attack.rb +99 -0
- data/lib/pwn/plugins/credit_card.rb +6 -1
- data/lib/pwn/plugins/dao_ldap.rb +19 -13
- data/lib/pwn/plugins/dao_mongo.rb +11 -5
- data/lib/pwn/plugins/dao_postgres.rb +28 -19
- data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
- data/lib/pwn/plugins/defect_dojo.rb +38 -22
- data/lib/pwn/plugins/detect_os.rb +5 -0
- data/lib/pwn/plugins/doctor.rb +149 -0
- data/lib/pwn/plugins/ein.rb +3 -0
- data/lib/pwn/plugins/exploit_dev.rb +264 -0
- data/lib/pwn/plugins/file_fu.rb +11 -8
- data/lib/pwn/plugins/frida.rb +61 -0
- data/lib/pwn/plugins/fuzz.rb +9 -6
- data/lib/pwn/plugins/gdb.rb +95 -0
- data/lib/pwn/plugins/git.rb +19 -14
- data/lib/pwn/plugins/github.rb +38 -15
- data/lib/pwn/plugins/google_workspace.rb +188 -45
- data/lib/pwn/plugins/hacker_one.rb +159 -35
- data/lib/pwn/plugins/hunter.rb +6 -3
- data/lib/pwn/plugins/ip_info.rb +9 -4
- data/lib/pwn/plugins/irc.rb +28 -15
- data/lib/pwn/plugins/jenkins.rb +65 -57
- data/lib/pwn/plugins/jira_data_center.rb +30 -22
- data/lib/pwn/plugins/jobs.rb +109 -0
- data/lib/pwn/plugins/json_pathify.rb +9 -5
- data/lib/pwn/plugins/log.rb +113 -13
- data/lib/pwn/plugins/mail_agent.rb +87 -79
- data/lib/pwn/plugins/metasploit.rb +11 -6
- data/lib/pwn/plugins/monkey_patch.rb +3 -0
- data/lib/pwn/plugins/msr206.rb +42 -28
- data/lib/pwn/plugins/nessus_cloud.rb +44 -4
- data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
- data/lib/pwn/plugins/nmap_it.rb +14 -34
- data/lib/pwn/plugins/nuclei.rb +57 -0
- data/lib/pwn/plugins/oauth2.rb +11 -5
- data/lib/pwn/plugins/ocr.rb +3 -0
- data/lib/pwn/plugins/open_api.rb +5 -2
- data/lib/pwn/plugins/openvas.rb +33 -25
- data/lib/pwn/plugins/packet.rb +152 -31
- data/lib/pwn/plugins/pdf_parse.rb +5 -2
- data/lib/pwn/plugins/pony.rb +86 -1
- data/lib/pwn/plugins/process_tube.rb +120 -0
- data/lib/pwn/plugins/ps.rb +7 -1
- data/lib/pwn/plugins/pwn_logger.rb +6 -2
- data/lib/pwn/plugins/rabbit_mq.rb +12 -7
- data/lib/pwn/plugins/radare2.rb +253 -0
- data/lib/pwn/plugins/recon.rb +161 -0
- data/lib/pwn/plugins/repl.rb +122 -1
- data/lib/pwn/plugins/scannable_codes.rb +5 -1
- data/lib/pwn/plugins/serial.rb +24 -14
- data/lib/pwn/plugins/shodan.rb +54 -35
- data/lib/pwn/plugins/slack_client.rb +11 -6
- data/lib/pwn/plugins/sock.rb +16 -8
- data/lib/pwn/plugins/spider.rb +5 -2
- data/lib/pwn/plugins/sqlmap.rb +49 -0
- data/lib/pwn/plugins/ssn.rb +3 -0
- data/lib/pwn/plugins/thread_pool.rb +6 -9
- data/lib/pwn/plugins/tor.rb +9 -4
- data/lib/pwn/plugins/transparent_browser.rb +62 -107
- data/lib/pwn/plugins/tty_spinner.rb +16 -2
- data/lib/pwn/plugins/twitter_api.rb +6 -2
- data/lib/pwn/plugins/uri_scheme.rb +4 -1
- data/lib/pwn/plugins/vault.rb +12 -3
- data/lib/pwn/plugins/vin.rb +24 -12
- data/lib/pwn/plugins/voice.rb +7 -2
- data/lib/pwn/plugins/volatility.rb +48 -0
- data/lib/pwn/plugins/vsphere.rb +9 -5
- data/lib/pwn/plugins/xxd.rb +12 -43
- data/lib/pwn/plugins/zaproxy.rb +30 -16
- data/lib/pwn/plugins.rb +19 -0
- data/lib/pwn/reports/ai_red_team.rb +6 -2
- data/lib/pwn/reports/csv.rb +8 -1
- data/lib/pwn/reports/fuzz.rb +5 -2
- data/lib/pwn/reports/html.rb +8 -1
- data/lib/pwn/reports/html_footer.rb +4 -3
- data/lib/pwn/reports/html_header.rb +6 -2
- data/lib/pwn/reports/json.rb +8 -1
- data/lib/pwn/reports/markdown.rb +8 -1
- data/lib/pwn/reports/pdf.rb +8 -1
- data/lib/pwn/reports/phone.rb +5 -2
- data/lib/pwn/reports/sast.rb +6 -2
- data/lib/pwn/reports/uri_buster.rb +5 -2
- data/lib/pwn/reports/xml.rb +8 -1
- data/lib/pwn/reports.rb +19 -0
- data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
- data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
- data/lib/pwn/sast/aws.rb +9 -3
- data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
- data/lib/pwn/sast/base64.rb +9 -3
- data/lib/pwn/sast/beef_hook.rb +9 -3
- data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
- data/lib/pwn/sast/cmd_execution_java.rb +9 -3
- data/lib/pwn/sast/cmd_execution_python.rb +9 -3
- data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
- data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
- data/lib/pwn/sast/csrf.rb +9 -3
- data/lib/pwn/sast/deserial_java.rb +9 -3
- data/lib/pwn/sast/emoticon.rb +9 -3
- data/lib/pwn/sast/eval.rb +9 -3
- data/lib/pwn/sast/factory.rb +9 -3
- data/lib/pwn/sast/http_authorization_header.rb +9 -3
- data/lib/pwn/sast/inner_html.rb +9 -3
- data/lib/pwn/sast/keystore.rb +9 -3
- data/lib/pwn/sast/local_storage.rb +9 -3
- data/lib/pwn/sast/location_hash.rb +9 -3
- data/lib/pwn/sast/log4j.rb +9 -3
- data/lib/pwn/sast/logger.rb +9 -3
- data/lib/pwn/sast/md5.rb +9 -3
- data/lib/pwn/sast/outer_html.rb +9 -3
- data/lib/pwn/sast/padding_oracle.rb +9 -3
- data/lib/pwn/sast/password.rb +9 -3
- data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
- data/lib/pwn/sast/php_type_juggling.rb +9 -3
- data/lib/pwn/sast/pom_version.rb +9 -3
- data/lib/pwn/sast/port.rb +9 -3
- data/lib/pwn/sast/post_message.rb +9 -3
- data/lib/pwn/sast/private_key.rb +9 -3
- data/lib/pwn/sast/redirect.rb +9 -3
- data/lib/pwn/sast/redos.rb +9 -3
- data/lib/pwn/sast/shell.rb +9 -3
- data/lib/pwn/sast/signature.rb +9 -3
- data/lib/pwn/sast/sql.rb +9 -3
- data/lib/pwn/sast/ssl.rb +9 -3
- data/lib/pwn/sast/sudo.rb +9 -3
- data/lib/pwn/sast/task_tag.rb +9 -3
- data/lib/pwn/sast/test_case_engine.rb +11 -7
- data/lib/pwn/sast/throw_errors.rb +9 -3
- data/lib/pwn/sast/token.rb +9 -3
- data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
- data/lib/pwn/sast/use_after_free.rb +9 -3
- data/lib/pwn/sast/version.rb +9 -3
- data/lib/pwn/sast/window_location_hash.rb +9 -3
- data/lib/pwn/sast.rb +4 -0
- data/lib/pwn/sdr/decoder/adsb.rb +36 -5
- data/lib/pwn/sdr/decoder/apt.rb +9 -6
- data/lib/pwn/sdr/decoder/base.rb +74 -22
- data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
- data/lib/pwn/sdr/decoder/dect.rb +12 -3
- data/lib/pwn/sdr/decoder/dsp.rb +229 -39
- data/lib/pwn/sdr/decoder/flex.rb +59 -11
- data/lib/pwn/sdr/decoder/gps.rb +12 -3
- data/lib/pwn/sdr/decoder/gsm.rb +24 -4
- data/lib/pwn/sdr/decoder/iridium.rb +12 -3
- data/lib/pwn/sdr/decoder/lora.rb +13 -4
- data/lib/pwn/sdr/decoder/lte.rb +27 -3
- data/lib/pwn/sdr/decoder/morse.rb +12 -3
- data/lib/pwn/sdr/decoder/p25.rb +12 -3
- data/lib/pwn/sdr/decoder/pager.rb +8 -5
- data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
- data/lib/pwn/sdr/decoder/rds.rb +14 -8
- data/lib/pwn/sdr/decoder/rfid.rb +12 -3
- data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
- data/lib/pwn/sdr/decoder/rtty.rb +8 -5
- data/lib/pwn/sdr/decoder/wifi.rb +12 -3
- data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
- data/lib/pwn/sdr/decoder.rb +9 -0
- data/lib/pwn/sdr/flipper_zero.rb +17 -10
- data/lib/pwn/sdr/frequency_allocation.rb +4 -1
- data/lib/pwn/sdr/gqrx.rb +178 -119
- data/lib/pwn/sdr/rfidler.rb +4 -1
- data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
- data/lib/pwn/sdr.rb +14 -0
- data/lib/pwn/sessions.rb +86 -16
- data/lib/pwn/setup.rb +94 -37
- data/lib/pwn/version.rb +1 -1
- data/lib/pwn/www/app_cobalt_io.rb +11 -5
- data/lib/pwn/www/bing.rb +10 -5
- data/lib/pwn/www/bug_crowd.rb +11 -5
- data/lib/pwn/www/checkip.rb +8 -4
- data/lib/pwn/www/coinbase_pro.rb +11 -5
- data/lib/pwn/www/duckduckgo.rb +12 -6
- data/lib/pwn/www/facebook.rb +11 -5
- data/lib/pwn/www/github.rb +11 -5
- data/lib/pwn/www/google.rb +11 -5
- data/lib/pwn/www/hacker_one.rb +20 -9
- data/lib/pwn/www/linkedin.rb +11 -5
- data/lib/pwn/www/pandora.rb +11 -5
- data/lib/pwn/www/pastebin.rb +9 -4
- data/lib/pwn/www/paypal.rb +19 -11
- data/lib/pwn/www/synack.rb +11 -5
- data/lib/pwn/www/torch.rb +13 -8
- data/lib/pwn/www/trading_view.rb +11 -5
- data/lib/pwn/www/twitter.rb +11 -5
- data/lib/pwn/www/uber.rb +11 -5
- data/lib/pwn/www/upwork.rb +11 -5
- data/lib/pwn/www/wayback_machine.rb +12 -6
- data/lib/pwn/www/youtube.rb +10 -5
- data/lib/pwn/www.rb +4 -0
- data/spec/conventions_spec.rb +118 -2
- data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
- data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
- data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
- data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
- data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
- data/spec/lib/pwn/plugins/doctor_spec.rb +23 -0
- data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
- data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
- data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
- data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
- data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
- data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
- data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
- data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
- data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
- data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
- data/third_party/pwn_rdoc.jsonl +126 -5
- metadata +47 -3
- data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
- data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'open3'
|
|
5
|
+
require 'securerandom'
|
|
6
|
+
|
|
7
|
+
module PWN
|
|
8
|
+
module Plugins
|
|
9
|
+
# Persistent r2pipe-style session: open/cmd/cmdj/close plus helpers.
|
|
10
|
+
module Radare2
|
|
11
|
+
@sessions = {}
|
|
12
|
+
|
|
13
|
+
public_class_method def self.required_bins
|
|
14
|
+
%w[r2]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Supported Method Parameters::
|
|
18
|
+
# session = PWN::Plugins::Radare2.open(
|
|
19
|
+
# path: 'required - filesystem path to the binary r2 should open'
|
|
20
|
+
# )
|
|
21
|
+
public_class_method def self.open(opts = {})
|
|
22
|
+
PWN::Plugins::Doctor.require_bin!(name: 'r2')
|
|
23
|
+
path = opts[:path].to_s
|
|
24
|
+
raise 'ERROR: path is required' if path.empty?
|
|
25
|
+
raise "ERROR: binary not found: #{path}" unless File.file?(path)
|
|
26
|
+
|
|
27
|
+
stdin, stdout, waiter = Open3.popen2('r2', '-q0', '-e', 'scr.color=0', path)
|
|
28
|
+
sid = SecureRandom.hex(8)
|
|
29
|
+
@sessions[sid] = { stdin: stdin, stdout: stdout, waiter: waiter, path: path }
|
|
30
|
+
read_until_null(io: stdout)
|
|
31
|
+
sid
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Supported Method Parameters::
|
|
35
|
+
# text = PWN::Plugins::Radare2.cmd(
|
|
36
|
+
# session: 'required - session id returned by #open',
|
|
37
|
+
# cmd: 'required - r2 command to run; returns raw text (e.g. pdf @ main)'
|
|
38
|
+
# )
|
|
39
|
+
public_class_method def self.cmd(opts = {})
|
|
40
|
+
sess = session!(opts)
|
|
41
|
+
line = opts[:cmd].to_s
|
|
42
|
+
raise 'ERROR: cmd is required' if line.empty?
|
|
43
|
+
|
|
44
|
+
sess[:stdin].write("#{line}\n")
|
|
45
|
+
sess[:stdin].flush
|
|
46
|
+
read_until_null(io: sess[:stdout])
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Supported Method Parameters::
|
|
50
|
+
# json = PWN::Plugins::Radare2.cmdj(
|
|
51
|
+
# session: 'required - session id returned by #open',
|
|
52
|
+
# cmd: 'required - r2 command; trailing j is added if missing and stdout is JSON.parse (e.g. afl or aflj)'
|
|
53
|
+
# )
|
|
54
|
+
public_class_method def self.cmdj(opts = {})
|
|
55
|
+
raw = cmd(opts.merge(cmd: opts[:cmd].to_s.sub(/j?\z/, 'j')))
|
|
56
|
+
JSON.parse(raw)
|
|
57
|
+
rescue JSON::ParserError
|
|
58
|
+
raw
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Supported Method Parameters::
|
|
62
|
+
# PWN::Plugins::Radare2.close(
|
|
63
|
+
# session: 'required - session id returned by #open'
|
|
64
|
+
# )
|
|
65
|
+
public_class_method def self.close(opts = {})
|
|
66
|
+
sess = session!(opts)
|
|
67
|
+
sess[:stdin].write("q\n")
|
|
68
|
+
sess[:stdin].close
|
|
69
|
+
sess[:stdout].close
|
|
70
|
+
@sessions.delete(opts[:session].to_s)
|
|
71
|
+
true
|
|
72
|
+
rescue StandardError
|
|
73
|
+
@sessions.delete(opts[:session].to_s)
|
|
74
|
+
false
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Supported Method Parameters::
|
|
78
|
+
# PWN::Plugins::Radare2.functions(
|
|
79
|
+
# session: 'required - session id returned by #open'
|
|
80
|
+
# )
|
|
81
|
+
public_class_method def self.functions(opts = {})
|
|
82
|
+
cmdj(opts.merge(cmd: 'aflj'))
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Supported Method Parameters::
|
|
86
|
+
# PWN::Plugins::Radare2.xrefs_to(
|
|
87
|
+
# session: 'required - session id returned by #open',
|
|
88
|
+
# addr: 'required - address or flag to list xrefs to (e.g. main or 0x401000)'
|
|
89
|
+
# )
|
|
90
|
+
public_class_method def self.xrefs_to(opts = {})
|
|
91
|
+
addr = opts[:addr].to_s
|
|
92
|
+
cmdj(opts.merge(cmd: "axtj #{addr}"))
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Supported Method Parameters::
|
|
96
|
+
# PWN::Plugins::Radare2.disasm(
|
|
97
|
+
# session: 'required - session id returned by #open',
|
|
98
|
+
# addr: 'required - address or flag to disassemble from',
|
|
99
|
+
# n: 'optional - instruction count (defaults to 32)'
|
|
100
|
+
# )
|
|
101
|
+
public_class_method def self.disasm(opts = {})
|
|
102
|
+
addr = opts[:addr].to_s
|
|
103
|
+
n = (opts[:n] || 32).to_i
|
|
104
|
+
cmd(opts.merge(cmd: "pd #{n} @ #{addr}"))
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Supported Method Parameters::
|
|
108
|
+
# PWN::Plugins::Radare2.strings(
|
|
109
|
+
# session: 'required - session id returned by #open'
|
|
110
|
+
# )
|
|
111
|
+
public_class_method def self.strings(opts = {})
|
|
112
|
+
cmdj(opts.merge(cmd: 'izj'))
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Supported Method Parameters::
|
|
116
|
+
# PWN::Plugins::Radare2.imports(
|
|
117
|
+
# session: 'required - session id returned by #open'
|
|
118
|
+
# )
|
|
119
|
+
public_class_method def self.imports(opts = {})
|
|
120
|
+
cmdj(opts.merge(cmd: 'iij'))
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Supported Method Parameters::
|
|
124
|
+
# PWN::Plugins::Radare2.sections(
|
|
125
|
+
# session: 'required - session id returned by #open'
|
|
126
|
+
# )
|
|
127
|
+
public_class_method def self.sections(opts = {})
|
|
128
|
+
cmdj(opts.merge(cmd: 'iSj'))
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Supported Method Parameters::
|
|
132
|
+
# PWN::Plugins::Radare2.binary_info(
|
|
133
|
+
# session: 'required - session id returned by #open'
|
|
134
|
+
# )
|
|
135
|
+
public_class_method def self.binary_info(opts = {})
|
|
136
|
+
cmdj(opts.merge(cmd: 'iIj'))
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Supported Method Parameters::
|
|
140
|
+
# PWN::Plugins::Radare2.decompile(
|
|
141
|
+
# session: 'required - session id returned by #open',
|
|
142
|
+
# addr: 'required - address or flag to decompile (needs r2ghidra)'
|
|
143
|
+
# )
|
|
144
|
+
public_class_method def self.decompile(opts = {})
|
|
145
|
+
addr = opts[:addr].to_s
|
|
146
|
+
cmd(opts.merge(cmd: "pdg @ #{addr}"))
|
|
147
|
+
rescue StandardError => e
|
|
148
|
+
{ error: "#{e.class}: #{e.message}", hint: 'r2ghidra plugin may be absent' }
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
public_class_method def self.authors
|
|
152
|
+
"AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
public_class_method def self.help
|
|
156
|
+
puts "USAGE:
|
|
157
|
+
# List host binaries this module expects to be installed.
|
|
158
|
+
#{self}.required_bins
|
|
159
|
+
|
|
160
|
+
# Open the binary in r2 (-q0) and return a session id.
|
|
161
|
+
#{self}.open(
|
|
162
|
+
path: 'required - filesystem path to the binary r2 should open'
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# Run a command and return raw text output.
|
|
166
|
+
#{self}.cmd(
|
|
167
|
+
session: 'required - session id returned by #open',
|
|
168
|
+
cmd: 'required - r2 command to run; returns raw text (e.g. pdf @ main)'
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Run a command, request JSON, and parse the result.
|
|
172
|
+
#{self}.cmdj(
|
|
173
|
+
session: 'required - session id returned by #open',
|
|
174
|
+
cmd: 'required - r2 command; trailing j is added if missing and stdout is JSON.parse (e.g. afl or aflj)'
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Close a session previously returned by #open.
|
|
178
|
+
#{self}.close(
|
|
179
|
+
session: 'required - session id returned by #open'
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# List functions after analysis (aflj JSON).
|
|
183
|
+
#{self}.functions(
|
|
184
|
+
session: 'required - session id returned by #open'
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
# List xrefs to an address or flag (axtj JSON).
|
|
188
|
+
#{self}.xrefs_to(
|
|
189
|
+
session: 'required - session id returned by #open',
|
|
190
|
+
addr: 'required - address or flag to list xrefs to (e.g. main or 0x401000)'
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
# Disassemble n instructions at addr (pd text).
|
|
194
|
+
#{self}.disasm(
|
|
195
|
+
session: 'required - session id returned by #open',
|
|
196
|
+
addr: 'required - address or flag to disassemble from',
|
|
197
|
+
n: 'optional - instruction count (defaults to 32)'
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# List strings in the binary (izj JSON).
|
|
201
|
+
#{self}.strings(
|
|
202
|
+
session: 'required - session id returned by #open'
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# List imported symbols (iij JSON).
|
|
206
|
+
#{self}.imports(
|
|
207
|
+
session: 'required - session id returned by #open'
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# List sections / segments (iSj JSON).
|
|
211
|
+
#{self}.sections(
|
|
212
|
+
session: 'required - session id returned by #open'
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
# Print binary header info (iIj JSON).
|
|
216
|
+
#{self}.binary_info(
|
|
217
|
+
session: 'required - session id returned by #open'
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# Decompile a function at addr via r2ghidra (pdg text).
|
|
221
|
+
#{self}.decompile(
|
|
222
|
+
session: 'required - session id returned by #open',
|
|
223
|
+
addr: 'required - address or flag to decompile (needs r2ghidra)'
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Print the AUTHOR(S) string for this module.
|
|
227
|
+
#{self}.authors
|
|
228
|
+
"
|
|
229
|
+
constants.sort
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
private_class_method def self.session!(opts = {})
|
|
233
|
+
sid = opts[:session].to_s
|
|
234
|
+
sess = @sessions[sid]
|
|
235
|
+
raise 'ERROR: session is required / unknown' unless sess
|
|
236
|
+
|
|
237
|
+
sess
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
private_class_method def self.read_until_null(opts = {})
|
|
241
|
+
io = opts[:io]
|
|
242
|
+
buf = +''
|
|
243
|
+
loop do
|
|
244
|
+
ch = io.read(1)
|
|
245
|
+
break if ch.nil? || ch == "\x00"
|
|
246
|
+
|
|
247
|
+
buf << ch
|
|
248
|
+
end
|
|
249
|
+
buf
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
end
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'open3'
|
|
5
|
+
require 'net/http'
|
|
6
|
+
require 'uri'
|
|
7
|
+
require 'timeout'
|
|
8
|
+
|
|
9
|
+
module PWN
|
|
10
|
+
module Plugins
|
|
11
|
+
# subfinder/httpx/masscan wrappers + cert-transparency (crt.sh, certspotter).
|
|
12
|
+
module Recon
|
|
13
|
+
UA = 'pwn-recon/1.0'
|
|
14
|
+
|
|
15
|
+
public_class_method def self.required_bins
|
|
16
|
+
[]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
public_class_method def self.subdomains(opts = {})
|
|
20
|
+
domain = opts[:domain].to_s.downcase.strip
|
|
21
|
+
raise 'ERROR: domain is required' if domain.empty?
|
|
22
|
+
|
|
23
|
+
names = []
|
|
24
|
+
if PWN::Plugins::Doctor.bin?(name: 'subfinder')
|
|
25
|
+
stdout, = Open3.capture3('subfinder', '-silent', '-d', domain)
|
|
26
|
+
names.concat(stdout.lines.map(&:strip).reject(&:empty?))
|
|
27
|
+
end
|
|
28
|
+
names.concat(Array(crt_sh(domain: domain)))
|
|
29
|
+
normalize_names(names: names, domain: domain)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
public_class_method def self.httpx(opts = {})
|
|
33
|
+
PWN::Plugins::Doctor.require_bin!(name: 'httpx')
|
|
34
|
+
hosts = Array(opts[:hosts] || opts[:urls])
|
|
35
|
+
stdout, = Open3.capture3('httpx', '-silent', '-json', stdin_data: "#{hosts.join("\n")}\n")
|
|
36
|
+
stdout.each_line.filter_map do |ln|
|
|
37
|
+
JSON.parse(ln)
|
|
38
|
+
rescue JSON::ParserError
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
public_class_method def self.masscan(opts = {})
|
|
44
|
+
bin = %w[masscan naabu].find { |b| PWN::Plugins::Doctor.bin?(name: b) }
|
|
45
|
+
raise PWN::Plugins::Doctor::MissingBinary, 'ERROR: masscan/naabu missing' unless bin
|
|
46
|
+
|
|
47
|
+
target = opts[:target].to_s
|
|
48
|
+
ports = (opts[:ports] || '1-1024').to_s
|
|
49
|
+
stdout, = Open3.capture3(bin, '-p', ports, target)
|
|
50
|
+
stdout
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
public_class_method def self.crt_sh(opts = {})
|
|
54
|
+
domain = opts[:domain].to_s.downcase.strip
|
|
55
|
+
raise 'ERROR: domain is required' if domain.empty?
|
|
56
|
+
|
|
57
|
+
errors = []
|
|
58
|
+
names = []
|
|
59
|
+
sources = [
|
|
60
|
+
"https://api.certspotter.com/v1/issuances?domain=#{URI.encode_www_form_component(domain)}&include_subdomains=true&expand=dns_names",
|
|
61
|
+
"https://crt.sh/?q=#{URI.encode_www_form_component(domain)}&output=json",
|
|
62
|
+
"https://crt.sh/?q=#{URI.encode_www_form_component("%.#{domain}")}&output=json"
|
|
63
|
+
]
|
|
64
|
+
sources.each do |url|
|
|
65
|
+
next if !names.empty? && url.include?('crt.sh')
|
|
66
|
+
|
|
67
|
+
rows = http_json(url: url, timeout: url.include?('crt.sh') ? 8 : (opts[:timeout] || 15))
|
|
68
|
+
names.concat(extract_dns_names(rows: rows))
|
|
69
|
+
rescue StandardError => e
|
|
70
|
+
errors << "#{URI(url).host}: #{e.class}: #{e.message}"
|
|
71
|
+
end
|
|
72
|
+
out = normalize_names(names: names, domain: domain)
|
|
73
|
+
return out unless out.empty?
|
|
74
|
+
|
|
75
|
+
raise "ERROR: cert-transparency lookup failed for #{domain} (#{errors.join('; ')})"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
public_class_method def self.authors
|
|
79
|
+
"AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
public_class_method def self.help
|
|
83
|
+
puts "USAGE:
|
|
84
|
+
# List host binaries this module expects to be installed.
|
|
85
|
+
#{self}.required_bins
|
|
86
|
+
|
|
87
|
+
# Run subdomains and return its result
|
|
88
|
+
#{self}.subdomains(
|
|
89
|
+
domain: 'required - FQDN to query (e.g. example.com)'
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Run httpx and return its result
|
|
93
|
+
#{self}.httpx(
|
|
94
|
+
hosts: 'optional - Array of hostnames or URLs to probe',
|
|
95
|
+
urls: 'optional - Array of HTTP(S) URLs'
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# Run masscan and return its result
|
|
99
|
+
#{self}.masscan(
|
|
100
|
+
target: 'optional - hostname, IP, or CIDR to scan',
|
|
101
|
+
ports: 'optional - port, list, or range (e.g. 22,80,443 or 1-1024)'
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Run crt sh and return its result
|
|
105
|
+
#{self}.crt_sh(
|
|
106
|
+
domain: 'required - FQDN to query (e.g. example.com)',
|
|
107
|
+
timeout: 'optional - seconds to wait before giving up'
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Print the AUTHOR(S) string for this module.
|
|
111
|
+
#{self}.authors
|
|
112
|
+
"
|
|
113
|
+
constants.sort
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
private_class_method def self.http_json(opts = {})
|
|
117
|
+
uri = URI(opts[:url].to_s)
|
|
118
|
+
timeout = (opts[:timeout] || 15).to_i
|
|
119
|
+
req = Net::HTTP::Get.new(uri)
|
|
120
|
+
req['User-Agent'] = UA
|
|
121
|
+
req['Accept'] = 'application/json'
|
|
122
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
123
|
+
http.use_ssl = (uri.scheme == 'https')
|
|
124
|
+
http.open_timeout = [timeout, 8].min
|
|
125
|
+
http.read_timeout = timeout
|
|
126
|
+
http.max_retries = 0
|
|
127
|
+
res = Timeout.timeout(timeout + 2) { http.request(req) }
|
|
128
|
+
raise "HTTP #{res.code}" unless res.is_a?(Net::HTTPSuccess)
|
|
129
|
+
|
|
130
|
+
body = res.body.to_s
|
|
131
|
+
raise JSON::ParserError, body[0, 120] unless body.lstrip.start_with?('[', '{')
|
|
132
|
+
|
|
133
|
+
JSON.parse(body)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
private_class_method def self.extract_dns_names(opts = {})
|
|
137
|
+
rows = opts[:rows]
|
|
138
|
+
return [] if rows.nil?
|
|
139
|
+
|
|
140
|
+
Array(rows).flat_map do |row|
|
|
141
|
+
next [] unless row.is_a?(Hash)
|
|
142
|
+
|
|
143
|
+
vals = []
|
|
144
|
+
vals.concat(Array(row['dns_names'] || row[:dns_names]))
|
|
145
|
+
vals.concat(row['name_value'].to_s.split(/[\s,]+/))
|
|
146
|
+
vals.concat(row['common_name'].to_s.split(/[\s,]+/))
|
|
147
|
+
vals
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
private_class_method def self.normalize_names(opts = {})
|
|
152
|
+
domain = opts[:domain].to_s.downcase
|
|
153
|
+
Array(opts[:names]).map { |n| n.to_s.strip.downcase.delete_prefix('*.') }
|
|
154
|
+
.reject(&:empty?)
|
|
155
|
+
.select { |n| n == domain || n.end_with?(".#{domain}") }
|
|
156
|
+
.uniq
|
|
157
|
+
.sort
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
data/lib/pwn/plugins/repl.rb
CHANGED
|
@@ -2131,18 +2131,139 @@ module PWN
|
|
|
2131
2131
|
|
|
2132
2132
|
public_class_method def self.help
|
|
2133
2133
|
puts "USAGE:
|
|
2134
|
+
# Restore the TTY after a spinner / agent turn so Pry/Reline prints
|
|
2135
|
+
#{self}.ready_tty!(
|
|
2136
|
+
skip: 'optional - skip value consumed by #ready_tty!',
|
|
2137
|
+
io: 'optional - io value consumed by #ready_tty!'
|
|
2138
|
+
)
|
|
2139
|
+
|
|
2140
|
+
# Compact token-count formatter for the pwn.ai PS1 (e.g. 0, 843, 12K, 250K, 1M)
|
|
2141
|
+
#{self}.compact_context_tokens(
|
|
2142
|
+
tokens: 'optional - tokens value consumed by #compact_context_tokens'
|
|
2143
|
+
)
|
|
2144
|
+
|
|
2145
|
+
# Run refresh ps1 proc and return its result
|
|
2134
2146
|
#{self}.refresh_ps1_proc(
|
|
2135
|
-
mode: '
|
|
2147
|
+
mode: 'optional - mode value consumed by #refresh_ps1_proc'
|
|
2136
2148
|
)
|
|
2137
2149
|
|
|
2150
|
+
# Run add commands and return its result
|
|
2138
2151
|
#{self}.add_commands
|
|
2139
2152
|
|
|
2153
|
+
# Run add hooks and return its result
|
|
2140
2154
|
#{self}.add_hooks
|
|
2141
2155
|
|
|
2156
|
+
# Run pwn ai complete kind and return its result
|
|
2157
|
+
#{self}.pwn_ai_complete_kind(
|
|
2158
|
+
line: 'optional - line value consumed by #pwn_ai_complete_kind'
|
|
2159
|
+
)
|
|
2160
|
+
|
|
2161
|
+
# Run pwn ai complete and return its result
|
|
2162
|
+
#{self}.pwn_ai_complete(
|
|
2163
|
+
target: 'required - token Reline is completing',
|
|
2164
|
+
line: 'optional - full line buffer',
|
|
2165
|
+
pry: 'optional - Pry instance for Ruby completion'
|
|
2166
|
+
)
|
|
2167
|
+
|
|
2168
|
+
# Run pwn ai complete command and return its result
|
|
2169
|
+
#{self}.pwn_ai_complete_command(
|
|
2170
|
+
line: 'optional - line value consumed by #pwn_ai_complete_command',
|
|
2171
|
+
target: 'required - hostname, IP, or CIDR to scan'
|
|
2172
|
+
)
|
|
2173
|
+
|
|
2174
|
+
# Run pwn ai complete path and return its result
|
|
2175
|
+
#{self}.pwn_ai_complete_path(
|
|
2176
|
+
target: 'required - hostname, IP, or CIDR to scan',
|
|
2177
|
+
line: 'optional - line value consumed by #pwn_ai_complete_path'
|
|
2178
|
+
)
|
|
2179
|
+
|
|
2180
|
+
# Run pwn ai complete ruby and return its result
|
|
2181
|
+
#{self}.pwn_ai_complete_ruby(
|
|
2182
|
+
target: 'optional - hostname, IP, or CIDR to scan',
|
|
2183
|
+
pry: 'optional - pry value consumed by #pwn_ai_complete_ruby (defaults to Thread.current[:pwn_ai_completer_pry])'
|
|
2184
|
+
)
|
|
2185
|
+
|
|
2186
|
+
# Install Reline dropdown for pwn-ai (commands / paths / Ruby)
|
|
2187
|
+
#{self}.install_pwn_ai_completer!(
|
|
2188
|
+
pry: 'optional - pry value consumed by #install_pwn_ai_completer!'
|
|
2189
|
+
)
|
|
2190
|
+
|
|
2191
|
+
# Run restore pwn ai completer and return its result
|
|
2192
|
+
#{self}.restore_pwn_ai_completer!
|
|
2193
|
+
|
|
2194
|
+
# Run a leading-slash pwn-ai command locally. Returns true when handled
|
|
2195
|
+
#{self}.pwn_ai_dispatch_slash!(
|
|
2196
|
+
request: 'optional - request value consumed by #pwn_ai_dispatch_slash!',
|
|
2197
|
+
pry: 'optional - pry value consumed by #pwn_ai_dispatch_slash!'
|
|
2198
|
+
)
|
|
2199
|
+
|
|
2200
|
+
# Run pwn ai engines and return its result
|
|
2201
|
+
#{self}.pwn_ai_engines
|
|
2202
|
+
|
|
2203
|
+
# Run pwn ai provider class and return its result
|
|
2204
|
+
#{self}.pwn_ai_provider_class(
|
|
2205
|
+
engine: 'optional - engine value consumed by #pwn_ai_provider_class'
|
|
2206
|
+
)
|
|
2207
|
+
|
|
2208
|
+
# Run pwn ai model ids and return its result
|
|
2209
|
+
#{self}.pwn_ai_model_ids(
|
|
2210
|
+
models: 'optional - models value consumed by #pwn_ai_model_ids'
|
|
2211
|
+
)
|
|
2212
|
+
|
|
2213
|
+
# Run pwn ai list llms and return its result
|
|
2214
|
+
#{self}.pwn_ai_list_llms(
|
|
2215
|
+
engine: 'required - engine value consumed by #pwn_ai_list_llms'
|
|
2216
|
+
)
|
|
2217
|
+
|
|
2218
|
+
# Run pwn ai engine model and return its result
|
|
2219
|
+
#{self}.pwn_ai_engine_model(
|
|
2220
|
+
engine: 'required - engine value consumed by #pwn_ai_engine_model'
|
|
2221
|
+
)
|
|
2222
|
+
|
|
2223
|
+
# Run pwn ai run model and return its result
|
|
2224
|
+
#{self}.pwn_ai_run_model(
|
|
2225
|
+
args: 'optional - Array args value consumed by #pwn_ai_run_model'
|
|
2226
|
+
)
|
|
2227
|
+
|
|
2228
|
+
# Run persist ai selection and return its result
|
|
2229
|
+
#{self}.persist_ai_selection(
|
|
2230
|
+
engine: 'required - engine value consumed by #persist_ai_selection',
|
|
2231
|
+
model: 'required - model value consumed by #persist_ai_selection'
|
|
2232
|
+
)
|
|
2233
|
+
|
|
2234
|
+
# Run pwn ai run cron and return its result
|
|
2235
|
+
#{self}.pwn_ai_run_cron(
|
|
2236
|
+
args: 'optional - Array args value consumed by #pwn_ai_run_cron'
|
|
2237
|
+
)
|
|
2238
|
+
|
|
2239
|
+
# Run pwn ai run sessions and return its result
|
|
2240
|
+
#{self}.pwn_ai_run_sessions(
|
|
2241
|
+
args: 'optional - Array args value consumed by #pwn_ai_run_sessions'
|
|
2242
|
+
)
|
|
2243
|
+
|
|
2244
|
+
# Run pwn ai run memory and return its result
|
|
2245
|
+
#{self}.pwn_ai_run_memory(
|
|
2246
|
+
args: 'optional - Array args value consumed by #pwn_ai_run_memory'
|
|
2247
|
+
)
|
|
2248
|
+
|
|
2249
|
+
# Run pwn ai run skills and return its result
|
|
2250
|
+
#{self}.pwn_ai_run_skills(
|
|
2251
|
+
args: 'optional - Array args value consumed by #pwn_ai_run_skills'
|
|
2252
|
+
)
|
|
2253
|
+
|
|
2254
|
+
# IRB-style suggest-as-you-type for the pwn REPL
|
|
2255
|
+
#{self}.enable_autocomplete(
|
|
2256
|
+
enabled: 'optional - Boolean (default true). false reverts to single-line cycling.',
|
|
2257
|
+
graph: 'optional - constants (PWN::Plugins::Nm<TAB>), instance methods'
|
|
2258
|
+
)
|
|
2259
|
+
|
|
2260
|
+
# Run start and return its result
|
|
2142
2261
|
#{self}.start
|
|
2143
2262
|
|
|
2263
|
+
# Print the AUTHOR(S) string for this module.
|
|
2144
2264
|
#{self}.authors
|
|
2145
2265
|
"
|
|
2266
|
+
constants.sort
|
|
2146
2267
|
end
|
|
2147
2268
|
end
|
|
2148
2269
|
end
|
|
@@ -72,15 +72,19 @@ module PWN
|
|
|
72
72
|
|
|
73
73
|
public_class_method def self.help
|
|
74
74
|
puts "USAGE:
|
|
75
|
+
# Run generate and return its result
|
|
75
76
|
#{self}.generate(
|
|
76
77
|
data: 'required - data to encode',
|
|
77
78
|
type: 'optional - :barcode || :qrcode (defaults to :qrcode)',
|
|
78
79
|
size: 'optional - size of the image when type is :qrcode (defaults to 200)',
|
|
79
|
-
path: 'optional - path to save image (defaults to
|
|
80
|
+
path: 'optional - path to save image (defaults to ./\#{data}.png)',
|
|
81
|
+
return_type: 'optional - :base64 || :file (defaults to :file)'
|
|
80
82
|
)
|
|
81
83
|
|
|
84
|
+
# Print the AUTHOR(S) string for this module.
|
|
82
85
|
#{self}.authors
|
|
83
86
|
"
|
|
87
|
+
constants.sort
|
|
84
88
|
end
|
|
85
89
|
end
|
|
86
90
|
end
|
data/lib/pwn/plugins/serial.rb
CHANGED
|
@@ -232,41 +232,51 @@ module PWN
|
|
|
232
232
|
|
|
233
233
|
public_class_method def self.help
|
|
234
234
|
puts "USAGE:
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
235
|
+
# Run connect and return its result
|
|
236
|
+
#{self}.connect(
|
|
237
|
+
block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)',
|
|
238
|
+
baud: 'optional - (defaults to 9600)',
|
|
239
|
+
data_bits: 'optional - (defaults to 8)',
|
|
240
|
+
stop_bits: 'optional - (defaults to 1)',
|
|
240
241
|
parity: 'optional - :even|:mark|:odd|:space|:none (defaults to :none)'
|
|
241
242
|
)
|
|
242
243
|
|
|
243
|
-
|
|
244
|
-
|
|
244
|
+
# Run get line state and return its result
|
|
245
|
+
#{self}.get_line_state(
|
|
246
|
+
serial_obj: 'required - required serial_obj returned from #connect method'
|
|
245
247
|
)
|
|
246
248
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
+
# Run get modem params and return its result
|
|
250
|
+
#{self}.get_modem_params(
|
|
251
|
+
serial_obj: 'required - serial_obj returned from #connect method'
|
|
249
252
|
)
|
|
250
253
|
|
|
254
|
+
# Run request and return its result
|
|
251
255
|
#{self}.request(
|
|
252
|
-
serial_obj: 'required serial_obj returned from #connect method',
|
|
253
|
-
payload: 'required - array of bytes OR string to write to serial device (e.g. [0x00, 0x41, 0x90, 0x00] OR
|
|
256
|
+
serial_obj: 'required - required serial_obj returned from #connect method',
|
|
257
|
+
payload: 'required - array of bytes OR string to write to serial device (e.g. [0x00, 0x41, 0x90, 0x00] OR ATDT+15555555\\r\\n'
|
|
254
258
|
)
|
|
255
259
|
|
|
260
|
+
# Run response and return its result
|
|
256
261
|
#{self}.response(
|
|
257
|
-
serial_obj: 'required serial_obj returned from #connect method'
|
|
262
|
+
serial_obj: 'required - serial_obj returned from #connect method'
|
|
258
263
|
)
|
|
259
264
|
|
|
260
|
-
|
|
265
|
+
# Run dump session data and return its result
|
|
266
|
+
#{self}.dump_session_data
|
|
261
267
|
|
|
268
|
+
# Run flush session data and return its result
|
|
262
269
|
#{self}.flush_session_data
|
|
263
270
|
|
|
271
|
+
# Run disconnect and return its result
|
|
264
272
|
#{self}.disconnect(
|
|
265
|
-
serial_obj: 'required serial_obj returned from #connect method'
|
|
273
|
+
serial_obj: 'required - serial_obj returned from #connect method'
|
|
266
274
|
)
|
|
267
275
|
|
|
276
|
+
# Print the AUTHOR(S) string for this module.
|
|
268
277
|
#{self}.authors
|
|
269
278
|
"
|
|
279
|
+
constants.sort
|
|
270
280
|
end
|
|
271
281
|
end
|
|
272
282
|
end
|