[Solved in under 1 hour 1 minute]
자아가 두개가 생길 것만 같다.
스스로 엄격한 편이라 계속 공부하자 뭐 하자 하는데 다른 한편으로는 그냥 쉬고싶다.
이게 인생이겠지.
가보자

와우 접속하자마자 풀기 싫게 생긴 녀석이 나왔다.
소스코드에 힌트가 있을 수 있으니 일단 보자
<!DOCTYPE html>
<html>
<head>
<!-- Basic -->
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Mobile Metas -->
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<!-- Site Metas -->
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta name="author" content="" />
<link rel="shortcut icon" href="static/images/favicon.png" type="">
<title> Flask-me </title>
<!-- bootstrap core css -->
<link rel="stylesheet" type="text/css" href="static/css/bootstrap.css" />
<!-- fonts style -->
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700;900&display=swap" rel="stylesheet">
<!--owl slider stylesheet -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css" />
<!-- font awesome style -->
<link href="static/css/font-awesome.min.css" rel="stylesheet" />
<!-- Custom styles for this template -->
<link href="static/css/style.css" rel="stylesheet" />
<!-- responsive style -->
<link href="static/css/responsive.css" rel="stylesheet" />
</head>
<body>
<div class="hero_area">
<div class="hero_bg_box">
<div class="bg_img_box">
<img src="static/images/hero-bg.png" alt="">
</div>
</div>
<!-- header section strats -->
<header class="header_section">
<div class="container-fluid">
<nav class="navbar navbar-expand-lg custom_nav-container ">
<a class="navbar-brand" href="/">
<span>
Flask-me
</span>
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class=""> </span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ">
<li class="nav-item active">
<a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"> About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Services</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Support</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Team</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/admin"> <i class="fa fa-user" aria-hidden="true"></i> Admin</a>
</li>
<form class="form-inline">
<button class="btn my-2 my-sm-0 nav_search-btn" type="submit">
<i class="fa fa-search" aria-hidden="true"></i>
</button>
</form>
</ul>
</div>
</nav>
</div>
</header>
<!-- end header section -->
<!-- slider section -->
<section class="slider_section ">
<div id="customCarousel1" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="container ">
<div class="row">
<div class="col-md-6 ">
<div class="detail-box">
<h1>
Work in <br>
Progress
</h1>
<p>
You are only a guest ! If you are an admin, go to Admin console
</p>
<div class="btn-box">
<a href="/admin" class="btn1">
Admin console
</a>
</div>
</div>
</div>
<div class="col-md-6">
<div class="img-box">
<img src="static/images/slider-img.png" alt="">
</div>
</div>
</div>
</div>
</div>
<div class="carousel-item ">
<div class="container ">
<div class="row">
<div class="col-md-6 ">
<div class="detail-box">
<h1>
Work in <br>
Progress
</h1>
<p>
You are only a guest ! If you are an admin, go to Admin console
</p>
<div class="btn-box">
<a href="/admin" class="btn1">
Admin console
</a>
</div>
</div>
</div>
<div class="col-md-6">
<div class="img-box">
<img src="static/images/slider-img.png" alt="">
</div>
</div>
</div>
</div>
</div>
<div class="carousel-item">
<div class="container ">
<div class="row">
<div class="col-md-6 ">
<div class="detail-box">
<h1>
Work in <br>
Progress
</h1>
<p>
You are only a guest ! If you are an admin, go to Admin console
</p>
<div class="btn-box">
<a href="/admin" class="btn1">
Admin console
</a>
</div>
</div>
</div>
<div class="col-md-6">
<div class="img-box">
<img src="static/images/slider-img.png" alt="">
</div>
</div>
</div>
</div>
</div>
</div>
<ol class="carousel-indicators">
<li data-target="#customCarousel1" data-slide-to="0" class="active"></li>
<li data-target="#customCarousel1" data-slide-to="1"></li>
<li data-target="#customCarousel1" data-slide-to="2"></li>
</ol>
</div>
</section>
<!-- end slider section -->
</div>
<!-- about section -->
<section class="about_section layout_padding">
<div class="container ">
<div class="heading_container heading_center">
<h2>
About <span>Us</span>
</h2>
</div>
<div class="row">
<div class="col-md-6 ">
<div class="img-box">
<img src="static/images/about-img.png" alt="">
</div>
</div>
<div class="col-md-6">
<div class="detail-box">
<h3>
We Are Flask-me
</h3>
<p>
Flask-me is a company specializing in wallet storage specifically for the rootcoin, a new cryptocurrency on the rise.
The current market offered no storage solution, which is why we specialized in this cryptocurrency.
</p>
<p>
For further information, please contact us using the button below or the contact details at the foot of the page.
</p>
<a href="">
Contact us
</a>
</div>
</div>
</div>
</div>
</section>
<!-- end about section -->
<!-- info section -->
<section class="info_section layout_padding2">
<div class="container">
<div class="row">
<div class="col-md-6 col-lg-3 info_col">
<div class="info_contact">
<h4>
Address
</h4>
<div class="contact_link_box">
<a href="">
<i class="fa fa-map-marker" aria-hidden="true"></i>
<span>
France
</span>
</a>
<a href="">
<i class="fa fa-phone" aria-hidden="true"></i>
<span>
Call +1337
</span>
</a>
<a href="">
<i class="fa fa-envelope" aria-hidden="true"></i>
<span>
support@flaskme.com
</span>
</a>
</div>
</div>
<div class="info_social">
<a href="">
<i class="fa fa-facebook" aria-hidden="true"></i>
</a>
<a href="">
<i class="fa fa-twitter" aria-hidden="true"></i>
</a>
<a href="">
<i class="fa fa-linkedin" aria-hidden="true"></i>
</a>
<a href="">
<i class="fa fa-instagram" aria-hidden="true"></i>
</a>
</div>
</div>
<div class="col-md-6 col-lg-3 info_col">
<div class="info_detail">
<h4>
Flag
</h4>
<p>
Flag for sale, payment in rootcoin only
</p>
</div>
</div>
<div class="col-md-6 col-lg-2 mx-auto info_col">
<div class="info_link_box">
<h4>
Links
</h4>
<div class="info_links">
<a class="active" href="/">
Home
</a>
<a class="" href="#">
About
</a>
<a class="" href="#">
Services
</a>
<a class="" href="#">
Support
</a>
<a class="" href="#">
Team
</a>
</div>
</div>
</div>
<div class="col-md-6 col-lg-3 info_col ">
<h4>
Subscribe
</h4>
<form action="#">
<input type="text" placeholder="Enter email" />
<button type="submit">
Subscribe
</button>
</form>
</div>
</div>
</div>
</section>
<!-- end info section -->
<!-- footer section -->
<section class="footer_section">
<div class="container">
<p>
© <span id="displayYear"></span> All Rights Reserved By
<a href="https://html.design/">Free Html Templates</a>
</p>
</div>
</section>
<!-- footer section -->
<!-- jQery -->
<script type="text/javascript" src="static/js/jquery-3.4.1.min.js"></script>
<!-- popper js -->
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous">
</script>
<!-- bootstrap js -->
<script type="text/javascript" src="static/js/bootstrap.js"></script>
<!-- owl slider -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js">
</script>
<!-- custom js -->
<script type="text/javascript" src="static/js/custom.js"></script>
</body>
</html>
Flag라고 적힌 녀석이 보이긴 하지만 /admin이라는 경로가 보이고,
너 guest다 admin이면 console로 가라 라는게 있는게 보여 바로 일단 들어가봤다.

접속하니 admin아니라고 나가라고 한다
딱 보면 이 문제는 admin으로 로그인하라는 문제인데 로그인 하는 창이 안보여 바로 쿠키부터 확인했다.

ey로 시작하는것으로 보아 JWT 인줄 알고 돌려봤는데

알고리즘, 헤더, 시크릿키 형식이 안 맞는것을 보고 JWT가 아닌거라고 판단 했고,
이게 무슨 토큰인지 알아봤다.
알아보는데 시간이 굉장히 오래 걸렸는데 형식이 비슷한 것을 찾고 보았더니,
Flask Session Cookies라고 백엔드로 저장이 되지 않는 방식이 있다고 한다.
base64 encoded JSON,TImestamp,HMAC 형식이라고 한다.
base64 encoded JSON : eyJhZG1pbiI6ImZhbHNlIiwidXNlcm5hbWUiOiJndWVzdCJ9.
TImestamp : aaeFFg.
HMAC : WkfgE88zcA061E_yuPEnaNlooLA
와 같을 것이다.
추가로 해당 기법의 취약점이 어떤게 있나 알아보던중
flask-unsign 툴로 키를 Brute-force 방식으로 해독하는 툴이라고 하여 이것부터 바로 해봤다.

flask-unsign --unsign --cookie "eyJhZG1pbiI6ImZhbHNlIiwidXNlcm5hbWUiOiJndWVzdCJ9.aaeFFg.WkfgE88zcA061E_yuPEnaNlooLA" --wordlist /usr/share/worldlists/rockyou.txt --no-literal-eval
웃픈 이야기가 하나 있는데 모의침투 습관성 기본 common.txt을 가지고 하는 경우가 있다보니 당연스럽게 워드리스트를 저거를 가지고 했는데 안돼서 안되네? 하고 다른 기법 알아보던 중
아. 나 키 Brute-force 하는거지.
깨닫고 바로 rockyou.txt로 바꿨다.
나같은 실수 하지 말자. 시간 엄청 낭비했다.
여하튼 그렇게 rockyou로 진행했고 's3cr3t' 이라는 시크릿키를 알아냈고 이거를 가지고 admin으로 변경한다음에 다시 인코딩을 할려고 한다.

flask-unsign --sign --cookie "{'admin':'true','username':'admin'}" --secret 's3cr3t'
다시 인코딩을 하여 값을 얻었고, 이거를 개발자도구에 쿠키값에 넣어보자

삽입후 홈페이지 새로고침하면~?

야~호
갖고가자

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Fl4sK_mi5c0nfigur4ti0n
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
항상 쿠키값이 ey로 시작하면 JWT다! 이런 편견이 있었는데,
이 문제를 풀고 다양한 방식이 있는 것을 알았고 인사이트가 더 넓어진 느낌이다.
기분이 너무 좋다. 재밌다. 하하.
RootMe Flask - Unsecure session Write-up
이상 보고 끝!