디렉토리 구조

 

 


목록 불러오기

검색타입, 검색키워드, 페이지를 입력받아 쿼리 요청

list.php

<?php
			// 입력받은 페이지
            $page = isset($_GET["page"])? $_GET["page"] : 1;
            // 입력받은 검색타입
            $searchType = isset($_GET["searchType"])? $_GET["searchType"] : '';
            //입력받은 검색키워드
            $searchValue = isset($_GET["searchValue"])? $_GET["searchValue"] : '';
            // 한 페이지당 보여줄 개수
            $itemPerPage = 10;
            
			// limit 0, 10은 0개를 패스하고 10개까지 보여준다.
            // 페이지가 2라면 10 개를 패스하고 10개를 보여줘야하기에 limit 10, 10이 되어야한다.
            $boardList = getBoardList(($page-1) * $itemPerPage, $itemPerPage, $searchType, $searchValue);

            while ($board =  mysqli_fetch_array($boardList)) 
            {
              $idx = $board['idx'];
              $title = $board['title'];
              $content = $board['content'];
              $regUser = $board['regUser'];
              $regTime = $board['regTime'];

              // var_dump($content);
              echo "<tr>";
              echo "<th class='idx' scope='row'>{$idx}</td>";
              echo "<td class='title' >{$title}</td>";
              echo "<td class='content'>{$content}</td>";
              echo "<td class='reg_user'>{$regUser}</td>";
              echo "<td class='reg_time'>{$regTime}</td>";
              echo "</tr>";
            }
            
          ?>

 

board_function.php

sql문 작성 시 검색 키워드가 존재한다면 sql문에 추가하고 
정렬은 '등록일시'와 'idx'를 역순으로 정렬한다.

function getBoardList($currentPage, $itemPerPage, $searchType, $searchValue)  {
  $db_conn = getDbConn();
  $token = $_COOKIE['REFRESH_TOKEN'];

  $sql = "SELECT IDX AS idx
  , TITLE as title
  , CONTENT as content
  , FIRST_REG_USER as regUser
  , FIRST_REG_TIME as regTime
   FROM tbl_board ";
  //echo "searchValue is {$searchValue}";
  // 키워드 검색이 들어오면 like검색 추가
  // TITLE => {$searchType} 할 수도 있지만 sqlInjection의 위험이 있다.
  
  if(!$searchValue=='' && $searchType == 'title') {
    $sql = $sql. "WHERE TITLE like'%{$searchValue}%' ";
  }
  // idx가 AutoIncrese이기에 등록순서, 아니라면 등록시간 순으로 해야하지만
  // FIRST_REG_TIME를 index를 안걸긴 했는데....
  $order = "ORDER BY FIRST_REG_TIME DESC, IDX DESC limit {$currentPage},{$itemPerPage}";

  $sql = $sql.$order;

  //echo $sql;
  return mysqli_query($db_conn, $sql);
}

 

 


페이지네이션

list.php

페이지네이션은 표기될 시작페이지번호, 현제 페이지번호, 표기될 마지막 페이지 번호로 구성 할 수 있다.

이를 구하기위해 총 페이지의 수를 가져오며 총 페이지 수를 가져올 때 목록과 동일하게 검색조건을(검색타입, 키워드) 추가한다.

 

또한 검색타입, 검색키워드를 가져와 사용하기 위해 onclick함수에 movePage(3) 과 같이 이동할 페이지의 값을 전달한다.

<?php
          	// 전체 페이지의 개수 =  올림(총 글의 개수 / 페이지 당 개수 )
            $totalPage = ceil((getTotalCount($searchType, $searchValue)) / 10);
            // 페이지네이션의 시작 페이지
            // 현재 페이지를 기준으로 왼쪽으로 4개 표기한다
            // 현재 페이지가 5보다 작다면 1이 시작페이지
            $startPage = $page - 4 <= 0 ? 1 : $page - 4;
            // 페이지네이션의 마지막 페이지
            // 현재 페이지를 기준으로 오른쪽으로 5개 표기한다
            // 현재 페이지 + 5가 totalPage보다 크다면 종료페이지는 totalPage
            $endPage = $page + 5 >= $totalPage ? $totalPage :  $page + 5;
            
            ini_set('display_errors', 1);
            
            for($i=$startPage; $i<= $endPage; $i=$i+1 )
            {
              // echo "<a href='/board/list.php?page={$i}'>  {$i}  </a>";
              
              // 현재 페이지와 같은 페이지 일때 색상 하이라이팅
              if ($page == $i) {
                echo "<li class='pagenation_min_width page-item active' aria-current='page'>";
                echo "<a class='page-link' href='/board/list.php?page={$i}'>{$i}</a>";
                echo "</li>";
              } else {
              
              	// 클릭하면 movePage(페이지번호) 함수 실행
                echo "<li class='pagenation_min_width page-item'><a class='page-link' onclick='movePage({$i})' >{$i}</a></li>";
              }
            }
            ?>

 

function movePage()

태그의 Id로 값을 찾아와 url을 구성한다.

function movePage(page) {
  	// 쿼리셀렉터로 검색타입과 검색키워드를 가져와서 url 생성
    // 문제 될 수 있는 Case
    // 검색 후 하단의 검색키워드를 제거하고 페이지를 클릭하면... 빈 키워드가 넘어가지만 페이지는 그대로...
    // 가장 좋은 방법은 페이지 클릭과 검색 클릭 시 함수를 분리하는 것... 하지만... 귀찮아...
    searchType = document.querySelector("#searchType").value
    searchValue = document.querySelector("#searchValue").value
    
    location.href="/board/list.php?page=" + page + "&searchType=" + searchType + "&searchValue=" +  searchValue

 

board_function.php

// 게시판의 총 글 수를 가져오는 코드
function getTotalCount($searchType, $searchValue) {
  $db_conn = getDbConn();
  $sql = "select count(IDX) as count FROM tbl_board ";

  // 키워드 검색이 들어온다면 총 글의 개수가 변경 될 수 있으므로 동일한 키워드 검색추가
  if(!$searchValue=='' && $searchType == 'title') {
    $sql = $sql. "WHERE TITLE like'%{$searchValue}%' ";
  }

  $result=mysqli_query($db_conn, $sql);
  $row = mysqli_fetch_array($result);
  return $row['count']; 
}

 

 


전체 코드

list.php

<?php
ini_set('display_errors', 1);
require_once '/app/lib/login_check.php';
require_once '../common/header.php';
require_once "/app/board/board_function.php";
?>
<div style="width: 100%; height:100%">

  <div style="width: 80%; height:20%; margin: 50px">
    <h1> 글 목록 </h1>
  </div>

  <div style="width: 80%; height:80%; margin: 50px"> 
    <div>
      <table style="display: block; width: 100" class="table">
        <thead>
          <tr>
            <th class="header_color" scope="col">#</th>
            <th class="header_color" scope="col">제목</th>
            <th class="header_color" scope="col">내용</th>
            <th class="header_color" scope="col">작성자</th>
            <th class="header_color" scope="col">작성일시</th>
          </tr>
        </thead>
        <tbody>
          <?php
			// 입력받은 페이지
            $page = isset($_GET["page"])? $_GET["page"] : 1;
            // 입력받은 검색타입
            $searchType = isset($_GET["searchType"])? $_GET["searchType"] : '';
            //입력받은 검색키워드
            $searchValue = isset($_GET["searchValue"])? $_GET["searchValue"] : '';
            // 한 페이지당 보여줄 개수
            $itemPerPage = 10;
            
			// limit 0, 10은 0개를 패스하고 10개까지 보여준다.
            // 페이지가 2라면 10 개를 패스하고 10개를 보여줘야하기에 limit 10, 10이 되어야한다.
            $boardList = getBoardList(($page-1) * $itemPerPage, $itemPerPage, $searchType, $searchValue);

            while ($board =  mysqli_fetch_array($boardList)) 
            {
              $idx = $board['idx'];
              $title = $board['title'];
              $content = $board['content'];
              $regUser = $board['regUser'];
              $regTime = $board['regTime'];

              // var_dump($content);
              echo "<tr>";
              echo "<th class='idx' scope='row'>{$idx}</td>";
              echo "<td class='title' >{$title}</td>";
              echo "<td class='content'>{$content}</td>";
              echo "<td class='reg_user'>{$regUser}</td>";
              echo "<td class='reg_time'>{$regTime}</td>";
              echo "</tr>";
            }
            
          ?>

        </tbody>
      </table>
    </div>

    
     
    

    <div style="display: block; width: 100%; text-align: center;">
      <nav aria-label="..." style="text-align: center;">
        <ul class="pagination" style="display: inline-flex;">
          <?php
          	// 전체 페이지의 개수 =  올림(총 글의 개수 / 페이지 당 개수 )
            $totalPage = ceil((getTotalCount($searchType, $searchValue)) / 10);
            // 페이지네이션의 시작 페이지
            // 현재 페이지를 기준으로 왼쪽으로 4개 표기한다
            // 현재 페이지가 5보다 작다면 1이 시작페이지
            $startPage = $page - 4 <= 0 ? 1 : $page - 4;
            // 페이지네이션의 마지막 페이지
            // 현재 페이지를 기준으로 오른쪽으로 5개 표기한다
            // 현재 페이지 + 5가 totalPage보다 크다면 종료페이지는 totalPage
            $endPage = $page + 5 >= $totalPage ? $totalPage :  $page + 5;
            
            ini_set('display_errors', 1);
            
            for($i=$startPage; $i<= $endPage; $i=$i+1 )
            {
              // echo "<a href='/board/list.php?page={$i}'>  {$i}  </a>";
              
              // 현재 페이지와 같은 페이지 일때 색상 하이라이팅
              if ($page == $i) {
                echo "<li class='pagenation_min_width page-item active' aria-current='page'>";
                echo "<a class='page-link' href='/board/list.php?page={$i}'>{$i}</a>";
                echo "</li>";
              } else {
              
              	// 클릭하면 movePage(페이지번호) 함수 실행
                echo "<li class='pagenation_min_width page-item'><a class='page-link' onclick='movePage({$i})' >{$i}</a></li>";
              }
            }
            ?>
        </ul>
        <button style="margin-left: 20px" type="button" class="btn btn-primary" onclick="moveToWrite()">글쓰기</button>
      </nav>
    </div>

    <div style="text-align: center;">
      <select id="searchType">
        <option value="title">제목</option>
      </select>
      <input id="searchValue" type="text" placholder="" 
      value="<?php
              if ($searchValue) {
                echo $searchValue;
              }
      ?>"/>
      <button style="margin-left: 20px" type="button" class="btn btn-primary" onclick="movePage(1)">검색</button>
    </div>

  </div>



</div>

<script>
  function moveToWrite() {
    location.href="/board/write.php"
  }
  function movePage(page) {
  	// 쿼리셀렉터로 검색타입과 검색키워드를 가져와서 url 생성
    // 문제 될 수 있는 Case
    // 검색 후 하단의 검색키워드를 제거하고 페이지를 클릭하면... 빈 키워드가 넘어가지만 페이지는 그대로...
    // 가장 좋은 방법은 페이지 클릭과 검색 클릭 시 함수를 분리하는 것... 하지만... 귀찮아...
    searchType = document.querySelector("#searchType").value
    searchValue = document.querySelector("#searchValue").value
    
    location.href="/board/list.php?page=" + page + "&searchType=" + searchType + "&searchValue=" +  searchValue
  }
</script>
  <style>
    .idx {
      width:5%
    }
    .title{
      width:25%;
      text-overflow : ellipsis ;
    }
    .content{
      width:30%;
      text-overflow : ellipsis ;
    }
    .reg_user{
      width:20%;
      text-overflow : ellipsis;
    }
    .reg_time{
      width:25%;
      text-overflow : ellipsis ;
    }
    .header_color {
      background: lightgray !important;
    }
    .pagenation_min_width {
      min-width: 40px;
    }
  </style>



<?php
// require_once '../common/footer.php';
?>

 

 


board_function.php

<?php
require '/app/lib/db_connection.php';

function getDbConn() {
  if (!isset($db_conn)) {
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
    $db_conn -> set_charset('utf8');
  }
  return $db_conn;
}

function insert_tbl_board($title, $content)  {
  $db_conn = getDbConn();
  $token = $_COOKIE['REFRESH_TOKEN'];
  // 아  구문에 특수문자 제거해야하는데~~~~
  $sql = "insert into tbl_board 
  (IDX, TITLE, CONTENT, FIRST_REG_USER, FIRST_REG_TIME, LAST_UPD_USER, LAST_UPD_TIME
  ) value 
  (null, '{$title}', '{$content}'
  , (SELECT USER_ID FROM user WHERE REFRESH_TOKEN ='{$token}'), NOW()
  , (SELECT USER_ID FROM user WHERE REFRESH_TOKEN ='{$token}'), NOW() )";

  // echo $sql;
  return mysqli_query($db_conn, $sql);
}


function getBoardList($currentPage, $itemPerPage, $searchType, $searchValue)  {
  $db_conn = getDbConn();
  $token = $_COOKIE['REFRESH_TOKEN'];

  $sql = "SELECT IDX AS idx
  , TITLE as title
  , CONTENT as content
  , FIRST_REG_USER as regUser
  , FIRST_REG_TIME as regTime
   FROM tbl_board ";
  //echo "searchValue is {$searchValue}";
  // 키워드 검색이 들어오면 like검색 추가
  // TITLE => {$searchType} 할 수도 있지만 sqlInjection의 위험이 있다.
  
  if(!$searchValue=='' && $searchType == 'title') {
    $sql = $sql. "WHERE TITLE like'%{$searchValue}%' ";
  }
  // idx가 AutoIncrese이기에 등록순서, 아니라면 등록시간 순으로 해야하지만
  // FIRST_REG_TIME를 index를 안걸긴 했는데....
  $order = "ORDER BY FIRST_REG_TIME DESC, IDX DESC limit {$currentPage},{$itemPerPage}";

  $sql = $sql.$order;

  //echo $sql;
  return mysqli_query($db_conn, $sql);
}
// 게시판의 총 글 수를 가져오는 코드
function getTotalCount($searchType, $searchValue) {
  $db_conn = getDbConn();
  $sql = "select count(IDX) as count FROM tbl_board ";

  // 키워드 검색이 들어온다면 총 글의 개수가 변경 될 수 있으므로 동일한 키워드 검색추가
  if(!$searchValue=='' && $searchType == 'title') {
    $sql = $sql. "WHERE TITLE like'%{$searchValue}%' ";
  }

  $result=mysqli_query($db_conn, $sql);
  $row = mysqli_fetch_array($result);
  return $row['count']; 
}

?>

 

 

 


 

결과

 

 

'웹 해킹 코스 > 과제' 카테고리의 다른 글

CTF Athentication Bypass(Get Admin)  (1) 2023.12.01
6주차 1.SQL Injection2  (2) 2023.12.01
4-2 게시판 구현하기(게시판 등록)  (0) 2023.11.19
4-1 javascript를 사용한 키로거  (0) 2023.11.16
3-2 JWT 토큰이란?  (3) 2023.11.12

디렉토리 구조

디렉토리 구조

 


wirte.php

 

<?php
ini_set('display_errors', 1);
require_once '../common/header.php';
require_once '/app/lib/login_check.php';
?>

// 등록 로직
<?php
  $isetTitle = isset($_POST['title']) && strlen($_POST['title']) > 0;
  $issetContent = isset($_POST['content']) && strlen($_POST['content']) > 0;
  $isSubmit = isset($_POST['submit']) && strlen($_POST['submit']) > 0;

  require_once "/app/board/board_function.php";
  if ($isetTitle && $issetContent && $isSubmit) {

    // 저장하기
    $title = $_POST['title'];
    $content = $_POST['content'];
    $result = insert_tbl_board($title, $content);
    
    if($result) {
      echo "<script>alert('작성 완료.');
               location.href='/board/list.php'
              </script>";
              exit;
    }

  }

?>

<div style="width: 100%; height:100%">

  <div style="width: 80%; height:20%; margin: 50px">
    <h1> 글쓰기 </h1>
  </div>

  <!-- 글쓰기 섹션 -->
  <div style="width: 80%; height:80%; margin: 50px"> 
    <form method="POST">
      <div style="height: 20%;"> 
        <div class="form-floating mb-3">
          <input type="text" name="title" class="form-control" id="floatingInput" placeholder="name@example.com"
          value="<?php
              if ($isSubmit) {
                echo $_POST['title'];
              }
            ?>"/>
          <label for="floatingInput">제목</label>
        </div>
      </div>
  
  
        <div >
          <div class="form-floating">
          <textarea name="content" style="height: 500px;" class="form-control" placeholder="Leave a comment here" id="floatingTextarea"
            ><?php
              if ($isSubmit) {
                echo $_POST['content'];
              }
            ?></textarea>
          <label for="floatingTextarea">내용</label>
        </div>
        <input hidden/ value="submit" name="submit">
        <div style="margin-top: 20px;">

          <button>작성</button>
          <span>
            <?php
              if($isSubmit)
              echo "제목, 내용을 확인해주세요";
            ?>
          </span>
        </div>

    </form>

  </div>
</div>

  



<?php
// require_once '../common/footer.php';
?>

 

 

board_function.php

<?php
require '/app/lib/db_connection.php';

function getDbConn() {
  if (!isset($db_conn)) {
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
    $db_conn -> set_charset('utf8');
  }
  return $db_conn;
}

function insert_tbl_board($title, $content)  {
  $db_conn = getDbConn();
  $token = $_COOKIE['REFRESH_TOKEN'];

  $sql = "insert into tbl_board 
  (IDX, TITLE, CONTENT, FIRST_REG_USER, FIRST_REG_TIME, LAST_UPD_USER, LAST_UPD_TIME
  ) value 
  (null, '{$title}', '{$content}'
  , (SELECT USER_ID FROM user WHERE REFRESH_TOKEN ='{$token}'), NOW()
  , (SELECT USER_ID FROM user WHERE REFRESH_TOKEN ='{$token}'), NOW() )";

  return mysqli_query($db_conn, $sql);
}

?>

 

쿠키에 id를 저장하고 있지만 변조가 쉽기 때문에 Refresh_token으로 USER_ID를 조회하여 insert한다.

 

 

 

 

 

 

 

날짜가 05시로 나오는데 DB 날짜를 수정해야할 것 같다.

 

'웹 해킹 코스 > 과제' 카테고리의 다른 글

6주차 1.SQL Injection2  (2) 2023.12.01
4-3 게시판 구현하기(게시판 목록)  (1) 2023.11.19
4-1 javascript를 사용한 키로거  (0) 2023.11.16
3-2 JWT 토큰이란?  (3) 2023.11.12
3-1(로그인 케이스)  (0) 2023.11.09

블루프린트를 사용한 위치 확인

 

 


C++를 사용한 위치 디버깅

// Fill out your copyright notice in the Description page of Project Settings.


#include "Item/Item.h"
#include "DrawDebugHelpers.h"

// 매크로의 구성 
#define DRAW_SPHERE(Location) if (GetWorld()) DrawDebugSphere(GetWorld(), Location, 25.f, 20, FColor::Red, false, 60.f)

// Sets default values
AItem::AItem()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// 액터가 스폰 되었을 때 실행되는 함수
void AItem::BeginPlay()
{
	Super::BeginPlay();
    // 아웃풋 콘솔에 표기되는 로그
	UE_LOG(LogTemp, Warning,TEXT("wow"));
    
	/* 
		UWorld* world = GetWorld();
		if (world) {
			DrawDebugSphere(world, location, 20.f, 32, FColor::Cyan,false ,60.f);
	
		}
	*/
	FVector Location = GetActorLocation();
	DRAW_SPHERE(Location);


	
}

// 매 프레임마다 동작하는 함수
void AItem::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	if (GEngine) {
    	// Actor가 가지는 이름
		FString Name = GetName();
        // GetName은 FStringdlrl 이므로 *Name으로 TCHAR로 변환
		 FString Message = FString::Printf(TEXT("Name is %s"), *Name);
		// FString Message = FString::Printf(TEXT("DeltaTime is %f"), DeltaTime);

		GEngine->AddOnScreenDebugMessage(1, 60, FColor::Cyan, Message);
	
	}
}

 

 

 

FString의 operator*

/**
 * Get pointer to the string
 *
 * @Return Pointer to Array of TCHAR if Num, otherwise the empty string
 */
UE_NODISCARD FORCEINLINE const TCHAR* operator*() const UE_LIFETIMEBOUND
{
	return Data.Num() ? Data.GetData() : TEXT("");
}

 

 


결과

 

흰색 구체는 BluePrint로 그린 것이고 빨간색이 C++로 그린 구체

Bandit Level 16 → Level 17

Level Goal

The credentials for the next level can be retrieved by submitting the password of the current level to a port on localhost in the range 31000 to 32000. First find out which of these ports have a server listening on them. Then find out which of those speak SSL and which don’t. There is only 1 server that will give the next credentials, the others will simply send back to you whatever you send to it.

Commands you may need to solve this level

ssh, telnet, nc, openssl, s_client, nmap

Helpful Reading Material


다음 레벨로가기위해서 현재레벨의 비밀번호를 제출해라 localhost의 31000 - 32000 포트중에서 포트는 1개 이상이다.

 

일단 31000 - 32000포트 중 리슨중인 포트를 찾아보자.

bandit16@bandit:~$ nc -vz localhost 31000-32000 2>&1 | grep "succeeded!"
Connection to localhost (127.0.0.1) 31046 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 31518 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 31691 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 31790 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 31960 port [tcp/*] succeeded!

nc(netcat): 호스트의 포트로 접속

  • -v: 추가 정보를 볼 수 있다. 옵션을 주지 않으면 아무것도 보이지 않는다.
  • -z: 기본적으로 nc는 포트가 리슨이라면 접속 후 대기한다. z옵션은 접속 하지 않고 검색만한다.
  • 31000-32000: 포트접속 범위

접속가능한 포트는 5개이다.

 

bandit16@bandit:~$ openssl s_client -connect localhost:31790
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 CN = localhost
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN = localhost
verify error:num=10:certificate has expired
notAfter=Nov 14 21:28:41 2023 GMT
verify return:1
depth=0 CN = localhost
notAfter=Nov 14 21:28:41 2023 GMT
verify return:1
---
Certificate chain
 0 s:CN = localhost
   i:CN = localhost
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA1
   v:NotBefore: Nov 14 21:27:41 2023 GMT; NotAfter: Nov 14 21:28:41 2023 GMT
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDCzCCAfOgAwIBAgIEPPSSSjANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDDAls
b2NhbGhvc3QwHhcNMjMxMTE0MjEyNzQxWhcNMjMxMTE0MjEyODQxWjAUMRIwEAYD
VQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDB
IlejBXoR34ClW2gpf9BwT9mBZj7MlPBqzA1wqoVj0aAaiIjVkuaqFM6bDWkebjql
z1R0bZfMPrlG2rcSB46R0mTZEc+dS1ifSw8lXzRB+YWbZcTU4O8xaDvnQcu6WcnV
tz6mnB7YwpFeZCZx1cEpcwYZAtqyhNz/4vjtvLc5tj7mk5oZRpuibEB/HJe+YIsY
AC2LBmIT5Ld6s5kOyIHhrlQZaIHX0j2q4SZusAUaVsvqF5lYJYqZRESHHxyV3EOw
AprzDR0COBlC9gX8es0j4/m2Kdt03xAcGD8i4Mk/Bj5gkkZyHm97h8hE8r2I1O39
/qmvYzubUFrfxKE/GGhZAgMBAAGjZTBjMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDBL
BglghkgBhvhCAQ0EPhY8QXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTmNhdC4g
U2VlIGh0dHBzOi8vbm1hcC5vcmcvbmNhdC8uMA0GCSqGSIb3DQEBBQUAA4IBAQCG
8jn78KslFph6DMwit8hQ1TB1bUtF6TfHojgjOGIYgKz2IECcDKyvBXqWG5XYM9B2
FR7yfQRTtVKraPipZg4eyXfFWeIEKbv7by868IlrjuseoprB3tGs6QdMPBkHyti8
4RUk9/RGNnzYJZ1/98FLqZz/Nn4PDq4w3CCk7tLH4lVYMEpbYDMp/FNS8QUZJHDr
xTxMD+q67q4YcnsW6zhYEYfDsaNlFaJ5jCIrgsEeZZZVsDCDUKEmDGKnpTba9oOo
BdhzuIB3Rfu2HKImaHx3BU7S3vSdvMlvCgODUKp745dOegSRM5O6KDql+Bv/EF5+
R4TyvPpslc6E6C4zgMbm
-----END CERTIFICATE-----
subject=CN = localhost
issuer=CN = localhost
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1339 bytes and written 373 bytes
Verification error: certificate has expired
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 10 (certificate has expired)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 50FFF1CE36BCE3573679CBB36DB4396B87650EA334A2399DABC686E585277B4F
    Session-ID-ctx:
    Resumption PSK: F67614789291F6260A5F666EC8FC35D3414BADC9E6EEB7CA4DF3C7B9D77D8129193263ED1E8072196AB0CE56C27EAEA8
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 4d ce 25 75 b6 48 66 23-0e 0c 97 96 1e 3d 75 b2   M.%u.Hf#.....=u.
    0010 - eb 9c 29 32 fd 07 13 85-99 26 1e 7a df ec 2d 88   ..)2.....&.z..-.
    0020 - 3f 10 0c 0d 8f 67 99 02-99 2d 62 67 57 3f 1f fa   ?....g...-bgW?..
    0030 - 02 15 a1 25 c2 d9 7b 8e-fd 7c 01 72 72 45 cb 63   ...%..{..|.rrE.c
    0040 - b5 06 03 e7 24 aa 49 f2-8e 9c 03 0f 8c ff 99 40   ....$.I........@
    0050 - 97 04 af 36 5a 6f b3 01-fc 30 76 c1 73 71 59 cf   ...6Zo...0v.sqY.
    0060 - f9 f7 26 14 f9 ad 68 5b-90 c8 51 0b d0 02 95 25   ..&...h[..Q....%
    0070 - 6c 8c e6 ad b0 d0 5d a4-07 47 97 66 46 88 2c 7e   l.....]..G.fF.,~
    0080 - 8c 61 79 17 56 e1 aa 80-2a 33 c2 9f 21 71 51 b2   .ay.V...*3..!qQ.
    0090 - 16 f6 a5 29 98 7b b3 e7-73 f0 df 88 f2 56 df fa   ...).{..s....V..
    00a0 - 94 10 e0 da 3c 41 65 1f-28 37 b8 34 0a 13 96 e3   ....<Ae.(7.4....
    00b0 - 49 16 14 0b 31 aa bc f7-d8 9a 83 05 dc 19 e7 f0   I...1...........
    00c0 - 74 07 e4 35 6c 65 33 de-6d 0a 2c 07 82 e6 4d e2   t..5le3.m.,...M.

    Start Time: 1700184803
    Timeout   : 7200 (sec)
    Verify return code: 10 (certificate has expired)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: F706A8D5FB8A59F379D588528A382372E116D92D7D0DA42D6533B4F63D7667ED
    Session-ID-ctx:
    Resumption PSK: 222B5500FBE8111E0343E8348B2BDB0E9BFDDBADC7CE1766E7D780B4FE09447BA63333F3E2A44ABB96E03A24E867BB8A
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 4d ce 25 75 b6 48 66 23-0e 0c 97 96 1e 3d 75 b2   M.%u.Hf#.....=u.
    0010 - 00 b7 e6 63 5f 88 45 78-6c 6c 18 a7 48 61 df 04   ...c_.Exll..Ha..
    0020 - cd 3c 15 e3 39 3d ed fb-35 a4 86 6e 78 d5 58 3e   .<..9=..5..nx.X>
    0030 - 72 b7 9c f1 45 b5 39 40-a9 e1 cc b4 89 73 70 6f   r...E.9@.....spo
    0040 - b0 b2 99 66 0a 6c fb d4-a7 e8 3d 29 31 16 30 3c   ...f.l....=)1.0<
    0050 - 02 1b e0 9c f1 9e 8d ae-9b 82 fc 29 a8 09 1f ad   ...........)....
    0060 - 7b b8 e3 b7 22 cc f2 ff-61 8e 0a 95 ec 0b 49 70   {..."...a.....Ip
    0070 - 9d d7 67 44 73 9c 7f c3-13 14 a8 d8 e3 4c 45 ff   ..gDs........LE.
    0080 - 42 b0 5f 9d 1a 9a f4 06-fc ba 3d 8e 9d 84 ce f8   B._.......=.....
    0090 - ca 89 bf 00 e7 a7 b2 d3-de 7a e0 e6 d9 08 a5 01   .........z......
    00a0 - 2a 89 be 69 7c 5d 56 d2-49 28 5e ea f7 55 f1 52   *..i|]V.I(^..U.R
    00b0 - 16 5e 33 c8 e1 a5 82 81-71 4c 2b b5 ba 0b 69 45   .^3.....qL+...iE
    00c0 - d7 da 8b a3 65 51 4a 66-af 5d f2 00 33 de 36 7b   ....eQJf.]..3.6{

    Start Time: 1700184803
    Timeout   : 7200 (sec)
    Verify return code: 10 (certificate has expired)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK
JQttfApK4SeyHwDlI9SXGR50qclOAil1
Correct!
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----

closed

 

/etc/tmp/patrache25 디렉토리 생성후 

key.private 파일을 생성하여  begin부터 end 까지 붙여넣기 후 chmod 600 key.private 한다.

bandit16@bandit:/tmp/patrache25$ ll
total 408
drwxrwxr-x    2 bandit16 bandit16   4096 Nov 17 01:41 ./
drwxrwx-wt 2115 root     root     405504 Nov 17 01:43 ../
-rw-------    1 bandit16 bandit16   1675 Nov 17 01:41 key.private
bandit16@bandit:/tmp/patrache25$ cat key.private
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----

 

이제 key로 bandit17로 접속하면 끝

bandit16@bandit:/tmp/patrache25$ ssh -i key.private bandit17@localhost -p2220

bandit17@bandit:~$ cat /etc/bandit_pass/bandit17
VwOSWtCA7lRKkTfbr2IDh6awj9RNZM5e

+ Recent posts