-
27/04/2017
-
30
-
76 bài viết
Phân tích và hướng dẫn triển khai CVE-2021-43617 (Phần 2)
Hi mọi người, lâu rồi mới có thời gian để ngồi viết phần còn lại của dạng phân tích và triển khai này. Nếu các bạn chưa đọc bài phân tích của CVE này của mình thì mọi có thể đọc ở đây nhé. Còn nếu đã đọc rồi thì mình cùng tiếp tục với phần 2 và thực hiện việc triển khai để khai thác thôi nào.
Chuẩn bị và cài đặt lỗ hổng
Việc đầu tiên là chuẩn bị môi trường cần thiết. Môi trường khai thác bao gồm:
Chuẩn bị và cài đặt lỗ hổng
Việc đầu tiên là chuẩn bị môi trường cần thiết. Môi trường khai thác bao gồm:
- Ubuntu (base on debian)
- Php
- Apache2
- Composer
- Laravel version dưới 8.70.2 (hoặc dùng version mới xong xóa bỏ phần vá của cái CVE này là được)
Cài đặt môi trường
Tắt tường lửa trên ubuntu:
Cài đặt PHP và các gói hỗ trợ cần thiết:
Còn nếu muốn tự tìm hiểu cách cài thì các bạn có thể tham khảo ở đây nhá. Nó có chưa tất cả các bước cài đặt.
https://www.digitalocean.com/commun...local-development-environment-on-ubuntu-18-04
Cài đặt và cấu hình apache2
Cài đặt qua lệnh dưới đây:
Bật rewrite mode:
Tắt tường lửa trên ubuntu:
Bash:
Sudo systemctl stop ufw
Cài đặt PHP và các gói hỗ trợ cần thiết:
Mã:
sudo apt install -y php7.4
sudo apt install -y php7.4-mysql php7.4-curl php7.4-json php7.4-cgi php7.4-xsl php7.4-mbstring php7.4-opcache php7.4-gd php7.4-pgsql php7.4-intl php7.4-bcmath php7.4-soap
Còn nếu muốn tự tìm hiểu cách cài thì các bạn có thể tham khảo ở đây nhá. Nó có chưa tất cả các bước cài đặt.
https://www.digitalocean.com/commun...local-development-environment-on-ubuntu-18-04
Cài đặt và cấu hình apache2
Cài đặt qua lệnh dưới đây:
Bash:
sudo apt install apache2 –y
Bật rewrite mode:
Bash:
sudo a2enmod rewrite
Bash:
sudo systemctl restart apache2
Sau khi restart thì kiểm tra xem rewrite đã được bật hay chưa bằng lệnh dưới đây:
Bash:
Sudo apachect –t –D DUMP_MODULES | grep rewrite
Khi output trả về là shared thì đã ok rồi.
Bật thêm mode AllowOveride tại /etc/apache2/apache2.conf
Tiếp theo là tạo một virtualhost mới. Sao chép tệp tin cấu hình mặc định và thay đổi tên thành laravel.conf
Bash:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/laravel.conf
Chỉnh sửa nội dung file như sau:
Còn nếu bạn lười thì có thể chỉnh sửa trực tiếp từ 000-default.conf
Sau khi thay đổi thì cần phải reload lại nhé. Ngoài ra cần kiểm tra thêm, cấu hình mặc định cho phép thực thi file phar hay chưa nhé.
/etc/apache2/mods-available/php7.4.conf
Cài composer
Bash:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
Cài đặt Laravel
Bạn có thể dùng lệnh composer để tạo project.
Bash:
cd /var/www/html
composer create-project laravel/laravel CVE –prefer-dist
Với phần này bạn cần cấp quyền đầy đủ cho CVE thư mục. Thực ra thì chỉ cần cấp quyền cho một vài thư mục. Nhưng vì lười biếng và muốn nhanh nên mình cấp quyền cho toàn thư mục
Bash:
chmod –R 777 CVE
Ngoài ra nếu muốn có thêm thử thách như mình thì làm thủ công như sau:
Tải gói larvel từ Github:
Bash:
cd /var/www/html/
sudo git clone https://github.com/laravel/laravel.git
Sau đó, di chuyển tới thư mực laravel. Tập tin composer.json sẽ chỉ định phiên bản các thành phần trong ứng dụng laravel. Mở tập tin vào chỉnh sửa thành 8.70.2
Lưu lại và chạy lệnh:
Để đổi phiên bản chỉ cần sửa tập tin composer.json và chạy
Vậy là đã xong cài đặt. Để kiểm tra xem nó thành công hay không thì truy cập vào đường dẫn
http://LOCAL_IP:8080 hoặc http://LOCAL_IP:80 cái port này tùy thuộc vào các cấu hình của virtualhost trên apache2 ở trên.
Ok vậy thì đã hòm hòm rồi, nhưng vì CVE này là phần upload nên cần phải có view để dễ dàng cho việc demo và khai thác. Ở đây, sẽ tạo ra một trang upload đơn giản. Vì laravel hoặt động theo mô hình MVC, nên chỉ cần tạo 3 tập tin tương ứng
Routes/web.php
Cuối cùng tạo frontend cho nó. Resources/views/Upload.blade.php
Rồi chạy lại compose và kiểm tra kết quả nào.
Khi ta truy cập vào Http://LOCAL_IP:8080/upload
Bash:
sudo composer install
sudo composer fund
Để đổi phiên bản chỉ cần sửa tập tin composer.json và chạy
Bash:
sudo composer update
Vậy là đã xong cài đặt. Để kiểm tra xem nó thành công hay không thì truy cập vào đường dẫn
http://LOCAL_IP:8080 hoặc http://LOCAL_IP:80 cái port này tùy thuộc vào các cấu hình của virtualhost trên apache2 ở trên.
Ok vậy thì đã hòm hòm rồi, nhưng vì CVE này là phần upload nên cần phải có view để dễ dàng cho việc demo và khai thác. Ở đây, sẽ tạo ra một trang upload đơn giản. Vì laravel hoặt động theo mô hình MVC, nên chỉ cần tạo 3 tập tin tương ứng
Routes/web.php
PHP:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UploadController;
Route::get('upload', [ UploadController::class, 'imageUpload' ])->name('image.upload');
Route::post('upload', [ UploadController::class, 'imageUploadPost' ])->name('image.upload.post'
Route::get('/', function () {
return view('welcome');
});`
tạo controler để xử lý các request:
`<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Concerns\ValidatesAttributes;`
`Trait Test{
use ValidatesAttributes;
public function tester($a, $b){return $this->shouldBlockPhpUpload($a, $b);}
}`
`Class Validate {
use Test;
}`
`class UploadController extends Controller
{`
`/**`
`Display a listing of the resource.`
`@return \Illuminate\Http\Response
*/
public function imageUpload()
{
return view('Upload');
}
/*`
`Display a listing of the resource.`
`@return \Illuminate\Http\Response
*/`
`public function imageUploadPost(Request $request)
{
$validate = new Validate;
if(!$validate->tester($request->image,['sfdfsdfdsfs'])){
$re = 'okok';
}
else {$re= 'no ok'; return back()->with('fail','Fail');}
$imageName = time().'.'.$request->image->getClientOriginalExtension();
$request->image->move(public_path('images'), $imageName);`
`/* Store $imageName name in DATABASE from HERE */
return back()
->with('success','You have successfully upload image.'.$re)
->with('image',$imageName)
;
}
Cuối cùng tạo frontend cho nó. Resources/views/Upload.blade.php
PHP:
<!DOCTYPE html>
<html>
<head>
<title>CVE</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading"><h2>CVE-2021-43617 LoL</h2></div>
<div class="panel-body">
@if ($message = Session::get('success'))
<div class="alert alert-success alert-block">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>{{ $message }}</strong>
</div>
<img src="images/{{ Session::get('image') }}">
@endif
@if ($message = Session::get('fail'))
<div class="alert alert-success alert-block">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>{{ $message }}</strong>
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('image.upload.post') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="row">
<div class="col-md-6">
<input type="file" name="image" class="form-control">
</div>
<div class="col-md-6">
<button type="submit" class="btn btn-success">Upload</button>
</div>
</div>
</form>
</div>
</div>
Rồi chạy lại compose và kiểm tra kết quả nào.
Khi ta truy cập vào Http://LOCAL_IP:8080/upload
Cuối cùng thì đã xong bước chuẩn bị. Bây giờ thực hành việc khai thác nó thôi.Khai thác lỗ hổng
Đầu tiên, khi ta upload một hình ảnh bình thường thì nó sẽ trả về như thế này:
Khi upload một file PHP thì sẽ báo lỗi.
Vì lỗ hổng này do blacklist trong hàm validate không có đuôi file .phar. Nên ta sẽ tạo 1 file đuôi phar với payload như trong hình rồi thực hiện việc upload lên.
Trước khi thực hiện việc upload lên thì từ máy tấn công lắng nghe trên cổng 1234 đã tạo trong payload.
Khi upload file phar lên thì máy tấn công nhận được kết quả như hình:
Như vậy là chúng ta đã thành công việc thiết lập demo và khai thác lỗ hổng rồi.
Nếu như các bạn có câu hỏi gì hay có những CVE nào mới thì có thể comment hoặc nhắn tin trực tiếp cho mình. Hoặc nếu như muốn trực tiếp phân tích chung với mình thì có thể hợp tác nhé.
Happy Hacking!!!