pwn 0.5.708 → 0.5.710
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/Gemfile +2 -2
- data/documentation/Installation.md +1 -0
- data/etc/default_skills/exploitdev/SKILL.md +38 -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 +49 -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 +58 -0
- data/etc/default_skills/pwn/plugins/credential_attack/references/urls.md +3 -0
- data/etc/default_skills/pwn/plugins/exploit_db/SKILL.md +49 -0
- data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +63 -0
- data/etc/default_skills/pwn/plugins/frida/SKILL.md +51 -0
- data/etc/default_skills/pwn/plugins/fuzz/SKILL.md +2 -0
- data/etc/default_skills/pwn/plugins/gdb/SKILL.md +53 -0
- data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
- data/etc/default_skills/pwn/plugins/k8s/SKILL.md +51 -0
- data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +50 -0
- data/etc/default_skills/pwn/plugins/preflight_checker/SKILL.md +59 -0
- data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +53 -0
- data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
- data/etc/default_skills/pwn/plugins/recon/SKILL.md +57 -0
- data/etc/default_skills/pwn/plugins/recon/references/urls.md +6 -0
- data/etc/default_skills/pwn/plugins/semgrep/SKILL.md +48 -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 +49 -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/tools/sessions.rb +8 -1
- 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 +7 -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 +72 -0
- data/lib/pwn/plugins/android.rb +71 -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 +158 -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/ein.rb +3 -0
- data/lib/pwn/plugins/exploit_db.rb +69 -0
- data/lib/pwn/plugins/exploit_dev.rb +330 -0
- data/lib/pwn/plugins/file_fu.rb +11 -8
- data/lib/pwn/plugins/frida.rb +112 -0
- data/lib/pwn/plugins/fuzz.rb +42 -6
- data/lib/pwn/plugins/gdb.rb +115 -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 +110 -0
- data/lib/pwn/plugins/json_pathify.rb +9 -5
- data/lib/pwn/plugins/k8s.rb +73 -0
- 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 +90 -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/preflight_checker.rb +166 -0
- data/lib/pwn/plugins/process_tube.rb +139 -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 +196 -0
- data/lib/pwn/plugins/repl.rb +122 -1
- data/lib/pwn/plugins/scannable_codes.rb +5 -1
- data/lib/pwn/plugins/semgrep.rb +61 -0
- 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 +17 -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 +67 -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 +22 -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 +106 -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/integration/help_contract_spec.rb +2 -0
- 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/exploit_db_spec.rb +13 -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/k8s_spec.rb +13 -0
- data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
- data/spec/lib/pwn/plugins/preflight_checker_spec.rb +23 -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/semgrep_spec.rb +13 -0
- data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
- data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
- data/spec/lib/pwn/req_queue_spec.rb +168 -0
- data/third_party/pwn_rdoc.jsonl +160 -5
- metadata +63 -7
- 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
data/lib/pwn/plugins/irc.rb
CHANGED
|
@@ -249,63 +249,76 @@ module PWN
|
|
|
249
249
|
|
|
250
250
|
public_class_method def self.help
|
|
251
251
|
puts "USAGE:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
# Run connect and return its result
|
|
253
|
+
#{self}.connect(
|
|
254
|
+
host: 'required - host or ip (defaults to 127.0.0.1)',
|
|
255
|
+
port: 'required - host port (defaults to 6667)',
|
|
256
|
+
nick: 'required - nick value consumed by #connect',
|
|
256
257
|
real: 'optional - real name (defaults to value of nick)',
|
|
257
258
|
tls: 'optional - boolean connect to host socket using TLS (defaults to false)'
|
|
258
259
|
)
|
|
259
260
|
|
|
260
|
-
#
|
|
261
|
+
# Run join and return its result
|
|
262
|
+
#{self}.join(
|
|
261
263
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
262
|
-
|
|
264
|
+
nick: 'required - nick value consumed by #join',
|
|
265
|
+
chan: 'required - channel to join'
|
|
263
266
|
)
|
|
264
267
|
|
|
265
|
-
#
|
|
268
|
+
# Run names and return its result
|
|
269
|
+
#{self}.names(
|
|
266
270
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
267
|
-
|
|
271
|
+
chan: 'required - channel to list names'
|
|
268
272
|
)
|
|
269
273
|
|
|
274
|
+
# Run privmsg and return its result
|
|
270
275
|
#{self}.privmsg(
|
|
271
276
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
272
277
|
chan: 'required - channel to send message',
|
|
273
|
-
message: 'required - message to send'
|
|
278
|
+
message: 'required - message to send',
|
|
279
|
+
nick: 'optional - nick value consumed by #privmsg'
|
|
274
280
|
)
|
|
275
281
|
|
|
276
|
-
#
|
|
282
|
+
# Run ping and return its result
|
|
283
|
+
#{self}.ping(
|
|
277
284
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
278
|
-
|
|
279
|
-
chan: 'required - channel to join'
|
|
285
|
+
message: 'required - message to send'
|
|
280
286
|
)
|
|
281
287
|
|
|
282
|
-
#
|
|
288
|
+
# Run pong and return its result
|
|
289
|
+
#{self}.pong(
|
|
283
290
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
284
|
-
|
|
291
|
+
message: 'required - message to send'
|
|
285
292
|
)
|
|
286
293
|
|
|
294
|
+
# Run part and return its result
|
|
287
295
|
#{self}.part(
|
|
288
296
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
289
297
|
chan: 'required - channel to part',
|
|
290
298
|
message: 'optional - message to send when parting'
|
|
291
299
|
)
|
|
292
300
|
|
|
301
|
+
# Run quit and return its result
|
|
293
302
|
#{self}.quit(
|
|
294
303
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
295
304
|
message: 'optional - message to send when quitting'
|
|
296
305
|
)
|
|
297
306
|
|
|
307
|
+
# Run listen and return its result
|
|
298
308
|
#{self}.listen(
|
|
299
309
|
irc_obj: 'required - irc_obj returned from #connect method',
|
|
300
310
|
verbose: 'optional - boolean to enable verbose output (defaults to false)'
|
|
301
311
|
)
|
|
302
312
|
|
|
303
|
-
|
|
313
|
+
# Run disconnect and return its result
|
|
314
|
+
#{self}.disconnect(
|
|
304
315
|
irc_obj: 'required - irc_obj returned from #connect method'
|
|
305
316
|
)
|
|
306
317
|
|
|
318
|
+
# Print the AUTHOR(S) string for this module.
|
|
307
319
|
#{self}.authors
|
|
308
320
|
"
|
|
321
|
+
constants.sort
|
|
309
322
|
end
|
|
310
323
|
end
|
|
311
324
|
end
|
data/lib/pwn/plugins/jenkins.rb
CHANGED
|
@@ -442,95 +442,103 @@ module PWN
|
|
|
442
442
|
# Display Usage for this Module
|
|
443
443
|
|
|
444
444
|
public_class_method def self.help
|
|
445
|
-
puts
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
445
|
+
puts "USAGE:
|
|
446
|
+
# Run connect and return its result
|
|
447
|
+
#{self}.connect(
|
|
448
|
+
ip: 'required - required host/ip of Jenkins Server',
|
|
449
|
+
port: 'optional - optional tcp port (defaults to 8080',
|
|
450
|
+
username: 'optional - optional username (functionality will be limited if ommitted)',
|
|
451
|
+
api_key: 'optional - optional api_key (functionality will be limited if ommitted)',
|
|
452
|
+
identity_file: 'optional - optional ssh private key path to AuthN w/ Jenkins PREFERRED over username/api_key',
|
|
453
|
+
ssl: 'optional - optional connect over TLS (defaults to true',
|
|
454
|
+
proxy: 'optional - optional debug proxy rest api requests to jenkins (e.g. http://127.0.0.1:8080)'
|
|
454
455
|
)
|
|
455
|
-
puts jenkins_obj.public_methods
|
|
456
456
|
|
|
457
|
+
# Run create user and return its result
|
|
457
458
|
#{self}.create_user(
|
|
458
|
-
jenkins_obj: '
|
|
459
|
-
username: '
|
|
460
|
-
password: 'optional - password
|
|
461
|
-
fullname: '
|
|
462
|
-
email: '
|
|
459
|
+
jenkins_obj: 'optional - jenkins obj value consumed by #create_user',
|
|
460
|
+
username: 'optional - username value consumed by #create_user',
|
|
461
|
+
password: 'optional - password value consumed by #create_user',
|
|
462
|
+
fullname: 'optional - fullname value consumed by #create_user',
|
|
463
|
+
email: 'optional - email value consumed by #create_user'
|
|
463
464
|
)
|
|
464
465
|
|
|
466
|
+
# Run create ssh credential and return its result
|
|
465
467
|
#{self}.create_ssh_credential(
|
|
466
|
-
jenkins_obj: '
|
|
467
|
-
username: '
|
|
468
|
-
private_key_path: '
|
|
469
|
-
key_passphrase: 'optional -
|
|
470
|
-
credential_id: 'optional
|
|
471
|
-
description: 'optional - description
|
|
472
|
-
domain: 'optional -
|
|
473
|
-
scope: 'optional -
|
|
468
|
+
jenkins_obj: 'optional - jenkins obj value consumed by #create_ssh_credential',
|
|
469
|
+
username: 'optional - username value consumed by #create_ssh_credential',
|
|
470
|
+
private_key_path: 'optional - private key path value consumed by #create_ssh_credential',
|
|
471
|
+
key_passphrase: 'optional - key passphrase value consumed by #create_ssh_credential',
|
|
472
|
+
credential_id: 'optional - credential id value consumed by #create_ssh_credential',
|
|
473
|
+
description: 'optional - description value consumed by #create_ssh_credential',
|
|
474
|
+
domain: 'optional - FQDN to query (e.g. example.com)',
|
|
475
|
+
scope: 'optional - scope value consumed by #create_ssh_credential'
|
|
474
476
|
)
|
|
475
477
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
+
# Run get all job git repos and return its result
|
|
479
|
+
#{self}.get_all_job_git_repos(
|
|
480
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method'
|
|
478
481
|
)
|
|
479
482
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
483
|
+
# Run list nested jobs and return its result
|
|
484
|
+
#{self}.list_nested_jobs(
|
|
485
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method',
|
|
486
|
+
view_path: 'required - required view path to list jobs'
|
|
484
487
|
)
|
|
485
488
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
+
# Run list nested views and return its result
|
|
490
|
+
#{self}.list_nested_views(
|
|
491
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method',
|
|
492
|
+
view_path: 'required - required view path list sub-views'
|
|
489
493
|
)
|
|
490
494
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
495
|
+
# Run create nested view and return its result
|
|
496
|
+
#{self}.create_nested_view(
|
|
497
|
+
jenkins_obj: 'optional - jenkins obj value consumed by #create_nested_view',
|
|
498
|
+
view_name: 'optional - view name value consumed by #create_nested_view',
|
|
499
|
+
create_in_view_path: 'optional - create in view path value consumed by #create_nested_view'
|
|
494
500
|
)
|
|
495
501
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
502
|
+
# Run add job to nested view and return its result
|
|
503
|
+
#{self}.add_job_to_nested_view(
|
|
504
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method',
|
|
505
|
+
view_path: 'required - required view path associate job',
|
|
506
|
+
job_name: 'required - required view path attach to a view'
|
|
500
507
|
)
|
|
501
508
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
copy_job_resp = #{self}.copy_job_no_fail_on_exist(
|
|
509
|
-
jenkins_obj: 'required jenkins_obj returned from #connect method',
|
|
510
|
-
existing_job_name: 'required existing job to copt to new job',
|
|
511
|
-
new_job_name: 'required name of new job'
|
|
509
|
+
# Run copy job no fail on exist and return its result
|
|
510
|
+
#{self}.copy_job_no_fail_on_exist(
|
|
511
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method',
|
|
512
|
+
existing_job_name: 'required - required existing job to copt to new job',
|
|
513
|
+
new_job_name: 'required - required name of new job'
|
|
512
514
|
)
|
|
513
515
|
|
|
516
|
+
# Run disable jobs by regex and return its result
|
|
514
517
|
#{self}.disable_jobs_by_regex(
|
|
515
|
-
jenkins_obj: 'required jenkins_obj returned from #connect method',
|
|
516
|
-
regex: 'required regex pattern for matching jobs to disable e.g. :regex =>
|
|
518
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method',
|
|
519
|
+
regex: 'required - required regex pattern for matching jobs to disable e.g. :regex => ^M[0-9]'
|
|
517
520
|
)
|
|
518
521
|
|
|
519
|
-
#
|
|
520
|
-
|
|
521
|
-
|
|
522
|
+
# Run delete jobs by regex and return its result
|
|
523
|
+
#{self}.delete_jobs_by_regex(
|
|
524
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method',
|
|
525
|
+
regex: 'required - required regex pattern for matching jobs to disable e.g. :regex => ^M[0-9]'
|
|
522
526
|
)
|
|
523
527
|
|
|
528
|
+
# Run clear build queue and return its result
|
|
524
529
|
#{self}.clear_build_queue(
|
|
525
|
-
jenkins_obj: 'required jenkins_obj returned from #connect method'
|
|
530
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method'
|
|
526
531
|
)
|
|
527
532
|
|
|
533
|
+
# Run disconnect and return its result
|
|
528
534
|
#{self}.disconnect(
|
|
529
|
-
jenkins_obj: 'required jenkins_obj returned from connect method'
|
|
535
|
+
jenkins_obj: 'required - required jenkins_obj returned from #connect method'
|
|
530
536
|
)
|
|
531
537
|
|
|
538
|
+
# Print the AUTHOR(S) string for this module.
|
|
532
539
|
#{self}.authors
|
|
533
|
-
|
|
540
|
+
"
|
|
541
|
+
constants.sort
|
|
534
542
|
end
|
|
535
543
|
end
|
|
536
544
|
end
|
|
@@ -607,67 +607,75 @@ module PWN
|
|
|
607
607
|
|
|
608
608
|
public_class_method def self.help
|
|
609
609
|
puts "USAGE:
|
|
610
|
-
|
|
610
|
+
# Run get all fields and return its result
|
|
611
|
+
#{self}.get_all_fields
|
|
611
612
|
|
|
612
|
-
user
|
|
613
|
-
|
|
613
|
+
# Run get user and return its result
|
|
614
|
+
#{self}.get_user(
|
|
615
|
+
username: 'required - username to lookup (e.g. jane.doe) (defaults to PWN::Plugins::AuthenticationHelper.username)',
|
|
614
616
|
params: 'optional - additional parameters to pass in the URI (e.g. expand, etc.)'
|
|
615
617
|
)
|
|
616
618
|
|
|
617
|
-
|
|
619
|
+
# Run get issue and return its result
|
|
620
|
+
#{self}.get_issue(
|
|
618
621
|
issue: 'required - issue to lookup (e.g. Bug, Issue, Story, or Epic ID)',
|
|
619
622
|
params: 'optional - additional parameters to pass in the URI (e.g. fields, expand, etc.)'
|
|
620
623
|
)
|
|
621
624
|
|
|
622
|
-
|
|
625
|
+
# Run create issue and return its result
|
|
626
|
+
#{self}.create_issue(
|
|
623
627
|
project_key: 'required - project key (e.g. PWN)',
|
|
624
628
|
summary: 'required - summary of the issue (e.g. Epic for PWN-1337)',
|
|
625
629
|
issue_type: 'required - issue type (e.g. :epic, :story, :bug)',
|
|
626
630
|
description: 'optional - description of the issue',
|
|
627
631
|
epic_name: 'optional - name of the epic',
|
|
628
632
|
additional_fields: 'optional - additional fields to set in the issue (e.g. labels, components, custom fields, etc.)',
|
|
629
|
-
attachments: 'optional - array of attachment paths to upload to the issue (e.g. [
|
|
630
|
-
comment: 'optional - comment to add to the issue (e.g.
|
|
633
|
+
attachments: 'optional - array of attachment paths to upload to the issue (e.g. [/tmp/file1.txt, /tmp/file2.txt])',
|
|
634
|
+
comment: 'optional - comment to add to the issue (e.g. This is a comment)'
|
|
631
635
|
)
|
|
632
636
|
|
|
633
|
-
|
|
634
|
-
|
|
637
|
+
# Run update issue and return its result
|
|
638
|
+
#{self}.update_issue(
|
|
635
639
|
fields: 'required - fields to update in the issue (e.g. summary, description, labels, components, custom fields, etc.)',
|
|
636
|
-
attachments: 'optional - array of attachment paths to upload to the issue (e.g. [
|
|
640
|
+
attachments: 'optional - array of attachment paths to upload to the issue (e.g. [/tmp/file1.txt, /tmp/file2.txt])',
|
|
641
|
+
issue: 'required - issue value consumed by #update_issue'
|
|
637
642
|
)
|
|
638
643
|
|
|
639
|
-
|
|
640
|
-
|
|
644
|
+
# Run issue comment and return its result
|
|
645
|
+
#{self}.issue_comment(
|
|
646
|
+
issue: 'required - issue to delete (e.g. Bug, Issue, Story, or Epic ID)',
|
|
641
647
|
comment_action: 'required - action to perform on the issue comment (e.g. :delete, :add, :update - Defaults to :add)',
|
|
642
648
|
comment_id: 'optional - comment ID to delete or update (e.g. 10000)',
|
|
643
|
-
author: 'optional - author of the comment (e.g.
|
|
644
|
-
comment: 'optional - comment to add or update in the issue (e.g.
|
|
649
|
+
author: 'optional - author of the comment (e.g. jane.doe)',
|
|
650
|
+
comment: 'optional - comment to add or update in the issue (e.g. This is a comment)'
|
|
645
651
|
)
|
|
646
652
|
|
|
647
|
-
|
|
653
|
+
# Run get issue type metadata and return its result
|
|
654
|
+
#{self}.get_issue_type_metadata(
|
|
648
655
|
project_key: 'required - project key (e.g. PWN)',
|
|
649
656
|
issue_type_id: 'required - issue type ID (e.g. issue[:fields][:issuetype][:id] from #get_issue method)'
|
|
650
657
|
)
|
|
651
658
|
|
|
652
|
-
|
|
659
|
+
# Run clone issue and return its result
|
|
660
|
+
#{self}.clone_issue(
|
|
653
661
|
issue: 'required - issue to clone (e.g. Bug, Issue, Story, or Epic ID)',
|
|
654
662
|
copy_attachments: 'optional - boolean to indicate whether to copy attachments (Defaults to false)'
|
|
655
663
|
)
|
|
656
664
|
|
|
657
|
-
|
|
665
|
+
# Run delete issue and return its result
|
|
666
|
+
#{self}.delete_issue(
|
|
658
667
|
issue: 'required - issue to delete (e.g. Bug, Issue, Story, or Epic ID)'
|
|
659
668
|
)
|
|
660
669
|
|
|
661
|
-
|
|
670
|
+
# Run delete attachment and return its result
|
|
671
|
+
#{self}.delete_attachment(
|
|
662
672
|
id: 'required - attachment ID to delete (e.g. 10000) found in #get_issue method'
|
|
663
673
|
)
|
|
664
674
|
|
|
665
|
-
|
|
666
|
-
* For more information on the Jira Server REST API, see:
|
|
667
|
-
* https://developer.atlassian.com/server/jira/platform/rest-apis/
|
|
668
|
-
|
|
675
|
+
# Print the AUTHOR(S) string for this module.
|
|
669
676
|
#{self}.authors
|
|
670
677
|
"
|
|
678
|
+
constants.sort
|
|
671
679
|
end
|
|
672
680
|
end
|
|
673
681
|
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'securerandom'
|
|
6
|
+
require 'open3'
|
|
7
|
+
|
|
8
|
+
module PWN
|
|
9
|
+
module Plugins
|
|
10
|
+
# Background jobs that survive a pwn-ai turn (scans, fuzz campaigns).
|
|
11
|
+
module Jobs
|
|
12
|
+
JOBS_DIR = File.join(Dir.home, '.pwn', 'jobs')
|
|
13
|
+
|
|
14
|
+
public_class_method def self.required_bins
|
|
15
|
+
[]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
public_class_method def self.start(opts = {})
|
|
19
|
+
cmd = opts[:command] || opts[:cmd]
|
|
20
|
+
raise 'ERROR: command is required' if cmd.to_s.empty?
|
|
21
|
+
|
|
22
|
+
FileUtils.mkdir_p(JOBS_DIR)
|
|
23
|
+
id = SecureRandom.hex(6)
|
|
24
|
+
log = File.join(JOBS_DIR, "#{id}.log")
|
|
25
|
+
meta = File.join(JOBS_DIR, "#{id}.json")
|
|
26
|
+
pid = spawn(cmd.to_s, %i[out err] => [log, 'a'])
|
|
27
|
+
Process.detach(pid)
|
|
28
|
+
row = {
|
|
29
|
+
id: id,
|
|
30
|
+
pid: pid,
|
|
31
|
+
command: cmd.to_s,
|
|
32
|
+
log: log,
|
|
33
|
+
session_id: opts[:session_id],
|
|
34
|
+
started_at: Time.now.utc.iso8601
|
|
35
|
+
}
|
|
36
|
+
File.write(meta, JSON.generate(row))
|
|
37
|
+
PWN::Plugins::ArtifactRegistry.register(session_id: opts[:session_id], path: log, kind: 'job-log') if opts[:session_id] && defined?(PWN::Plugins::ArtifactRegistry) && File.file?(log)
|
|
38
|
+
row
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
public_class_method def self.status(opts = {})
|
|
42
|
+
row = load_job(opts)
|
|
43
|
+
alive = begin
|
|
44
|
+
Process.kill(0, row[:pid].to_i)
|
|
45
|
+
true
|
|
46
|
+
rescue Errno::ESRCH, Errno::EPERM
|
|
47
|
+
false
|
|
48
|
+
end
|
|
49
|
+
row.merge(alive: alive)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
public_class_method def self.tail(opts = {})
|
|
53
|
+
row = load_job(opts)
|
|
54
|
+
n = (opts[:lines] || 40).to_i
|
|
55
|
+
return '' unless File.file?(row[:log])
|
|
56
|
+
|
|
57
|
+
File.readlines(row[:log]).last(n).join
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
public_class_method def self.stop(opts = {})
|
|
61
|
+
row = load_job(opts)
|
|
62
|
+
Process.kill('TERM', row[:pid].to_i)
|
|
63
|
+
true
|
|
64
|
+
rescue Errno::ESRCH
|
|
65
|
+
false
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
public_class_method def self.authors
|
|
69
|
+
"AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
public_class_method def self.help
|
|
73
|
+
puts "USAGE:
|
|
74
|
+
# List host binaries this module expects to be installed.
|
|
75
|
+
#{self}.required_bins
|
|
76
|
+
|
|
77
|
+
# Run start and return its result
|
|
78
|
+
#{self}.start(
|
|
79
|
+
command: 'required - command value consumed by #start (defaults to opts[:cmd])',
|
|
80
|
+
cmd: 'required - command string to run',
|
|
81
|
+
session_id: 'optional - session id value consumed by #start'
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Run status and return its result
|
|
85
|
+
#{self}.status
|
|
86
|
+
|
|
87
|
+
# Run tail and return its result
|
|
88
|
+
#{self}.tail(
|
|
89
|
+
lines: 'optional - lines value consumed by #tail'
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Run stop and return its result
|
|
93
|
+
#{self}.stop
|
|
94
|
+
|
|
95
|
+
# Print the AUTHOR(S) string for this module.
|
|
96
|
+
#{self}.authors
|
|
97
|
+
"
|
|
98
|
+
constants.sort
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
private_class_method def self.load_job(opts = {})
|
|
102
|
+
id = opts[:id].to_s
|
|
103
|
+
path = File.join(JOBS_DIR, "#{id}.json")
|
|
104
|
+
raise "ERROR: unknown job #{id}" unless File.file?(path)
|
|
105
|
+
|
|
106
|
+
JSON.parse(File.read(path), symbolize_names: true)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -33,13 +33,17 @@ module PWN
|
|
|
33
33
|
# Display Usage for this Module
|
|
34
34
|
|
|
35
35
|
public_class_method def self.help
|
|
36
|
-
puts
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
puts "USAGE:
|
|
37
|
+
# Run search key and return its result
|
|
38
|
+
#{self}.search_key(
|
|
39
|
+
json_data_struct: 'required - required JSON data structure',
|
|
40
|
+
key: 'required - required key to find in JSON data structure. returns key values'
|
|
40
41
|
)
|
|
42
|
+
|
|
43
|
+
# Print the AUTHOR(S) string for this module.
|
|
41
44
|
#{self}.authors
|
|
42
|
-
|
|
45
|
+
"
|
|
46
|
+
constants.sort
|
|
43
47
|
end
|
|
44
48
|
end
|
|
45
49
|
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'open3'
|
|
4
|
+
|
|
5
|
+
module PWN
|
|
6
|
+
module Plugins
|
|
7
|
+
# trivy / kube-hunter wrappers plus docker-socket preflight.
|
|
8
|
+
module K8s
|
|
9
|
+
public_class_method def self.required_bins
|
|
10
|
+
%w[trivy]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
public_class_method def self.trivy(opts = {})
|
|
14
|
+
PWN::Plugins::PreflightChecker.require_bin!(name: 'trivy')
|
|
15
|
+
target = opts[:target] || opts[:image] || opts[:path]
|
|
16
|
+
raise 'ERROR: target is required' if target.to_s.empty?
|
|
17
|
+
|
|
18
|
+
mode = (opts[:mode] || :image).to_s
|
|
19
|
+
cmd = ['trivy', mode, '--format', 'json', target.to_s]
|
|
20
|
+
stdout, stderr, status = Open3.capture3(*cmd)
|
|
21
|
+
{ stdout: stdout, stderr: stderr, exit: status.exitstatus }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
public_class_method def self.kube_hunter(opts = {})
|
|
25
|
+
return { error: 'kube-hunter missing', hint: 'pip install kube-hunter' } unless PWN::Plugins::PreflightChecker.bin?(name: 'kube-hunter')
|
|
26
|
+
|
|
27
|
+
cmd = ['kube-hunter']
|
|
28
|
+
cmd += ['--remote', opts[:remote].to_s] if opts[:remote]
|
|
29
|
+
cmd << '--report' << 'json'
|
|
30
|
+
stdout, stderr, status = Open3.capture3(*cmd)
|
|
31
|
+
{ stdout: stdout, stderr: stderr, exit: status.exitstatus }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
public_class_method def self.docker_socket?(opts = {})
|
|
35
|
+
path = (opts[:path] || '/var/run/docker.sock').to_s
|
|
36
|
+
PWN::Plugins::PreflightChecker.service?(name: 'docker', path: path)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
public_class_method def self.authors
|
|
40
|
+
"AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
public_class_method def self.help
|
|
44
|
+
puts "USAGE:
|
|
45
|
+
# List host binaries this module expects to be installed.
|
|
46
|
+
#{self}.required_bins
|
|
47
|
+
|
|
48
|
+
# Scan a container image or filesystem with trivy.
|
|
49
|
+
#{self}.trivy(
|
|
50
|
+
target: 'required - image name or path',
|
|
51
|
+
image: 'optional - alias for target',
|
|
52
|
+
path: 'optional - alias for target',
|
|
53
|
+
mode: 'optional - trivy subcommand (defaults to image)'
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Run kube-hunter (remote cluster optional).
|
|
57
|
+
#{self}.kube_hunter(
|
|
58
|
+
remote: 'optional - API server host for --remote'
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# True when the docker unix socket is present.
|
|
62
|
+
#{self}.docker_socket?(
|
|
63
|
+
path: 'optional - socket path (defaults to /var/run/docker.sock)'
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Print the AUTHOR(S) string for this module.
|
|
67
|
+
#{self}.authors
|
|
68
|
+
"
|
|
69
|
+
constants.sort
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|